{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setting boundary conditions in PorePy\n",
    "Before reading this tutorial, we recommend reading [the single phase flow tutorial](./single_phase_flow.ipynb).\n",
    "\n",
    "In this tutorial we will visit how to set boundary conditions for different model problems in PorePy.\n",
    "\n",
    "We start by defining the geometry for the example models that we will show below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from porepy.applications.md_grids.domains import nd_cube_domain\n",
    "import numpy as np\n",
    "import porepy as pp\n",
    "\n",
    "\n",
    "class ModifiedGeometry:\n",
    "    def set_domain(self) -> None:\n",
    "        \"\"\"Defining a two-dimensional square domain with sidelength 2.\"\"\"\n",
    "        size = self.solid.convert_units(2, \"m\")\n",
    "        self._domain = nd_cube_domain(2, size)\n",
    "\n",
    "    def grid_type(self) -> str:\n",
    "        \"\"\"Choosing the grid type for our domain.\"\"\"\n",
    "        return self.params.get(\"grid_type\", \"cartesian\")\n",
    "\n",
    "    def meshing_arguments(self) -> dict:\n",
    "        \"\"\"Meshing arguments for md-grid creation.\"\"\"\n",
    "        cell_size = self.solid.convert_units(0.25, \"m\")\n",
    "        mesh_args: dict[str, float] = {\"cell_size\": cell_size}\n",
    "        return mesh_args"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Basics\n",
    "PorePy provides several ways to tailor the boundary conditions for your problem.\n",
    "To set a boundary condition do the following:\n",
    "\n",
    "1) Specify the type of the boundary condition (Dirichlet or Neumann) in the method named `bc_type_<flux_name>`.\n",
    "\n",
    "2) Set the values of relevant physical quantities on the boundary in the method named `bc_values_<physical_quantity>`.\n",
    "\n",
    "All methods for setting boundary conditions follow the naming convention listed above. \n",
    "\n",
    "Some of the possible physical quantities will be listed below in this tutorial. All the possible methods can be found in the source code of the `BoundaryConditionMixin` of the corresponding model, for example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bc_type_darcy_flux\n",
      "bc_type_fluid_flux\n",
      "bc_values_darcy_flux\n",
      "bc_values_fluid_flux\n",
      "bc_values_pressure\n"
     ]
    }
   ],
   "source": [
    "for x in dir(pp.models.fluid_mass_balance.BoundaryConditionsSinglePhaseFlow):\n",
    "    if x.startswith(\"bc_values\") or x.startswith(\"bc_type\"):\n",
    "        print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let us consider the basic example of setting these boundary conditions for the single-phase flow model:\n",
    "\n",
    "* West boundary: constant Neumann in-flux in the middle of the side, no flux elsewhere.\n",
    "* East boundary: constant non-zero Dirichlet pressure.\n",
    "* South and north boundaries: no flux.\n",
    "\n",
    "The type of a boundary condition is set with the `pp.BoundaryCondition` class. By default, it sets all the boundary faces to Neumann. To set Dirichlet conditions, the relevant boundary sides should be provided to `pp.BoundaryCondition`. \n",
    "The domain sides are accessed with the `domain_boundary_sides` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAicAAAHHCAYAAABk/PjCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABcs0lEQVR4nO3deVxU9f4/8NcwyoDLACqrIo5LuAKiyYX0CoWikD/p97tupeLazeSm0dUrfXOlRMuFFgNNBZfcyqW+aSJSaCJqLpSWmhoKGoNLwggqyHB+fxBzm9iGmYEzB17Px+M8hvOZz+d83h+HYd5+PueckQmCIICIiIjIQliJHQARERHRnzE5ISIiIovC5ISIiIgsCpMTIiIisihMToiIiMiiMDkhIiIii8LkhIiIiCwKkxMiIiKyKExOiIiIyKIwOaFaBQYGIjAwUOww6iwpKQkymQzXr1+v974WLVoEmUxWa71JkyahU6dO9R5PYyKTybBo0SKxw6g3Uv+dMPV9JvXxU/1gctIIVfyxkMlkOHbsWKXnBUGAu7s7ZDIZnn/+eREiJCIiql4zsQOg+mNjY4Nt27Zh4MCBeuVHjhzBzZs3oVAoDDrOoUOH6iO8JumTTz5BWVmZ2GFIyqNHj9CsGf9UWaoJEyZg7NixBv89ITIEZ04asdDQUHz22WcoLS3VK9+2bRv69esHFxcXg45jbW0Na2vr+gixyWnevDn/iNeRjY0NkxORFRUVVfucXC6HjY2NQcuaRIZictKIjRs3Dvfu3UNKSoqurKSkBJ9//jlefPFFg49jyDkniYmJkMlk2Lhxo1750qVLIZPJcODAgVr7+frrrzFo0CC0bNkSrVu3RlhYGH766SeDYvzpp5/w7LPPwtbWFh06dMDbb79dbzMUx44dw9NPPw0bGxt06dIFa9euNbitoevrnTp1wvPPP4+0tDT0798ftra26NOnD9LS0gAAe/bsQZ8+fWBjY4N+/frh3LlzBvWfn5+P2bNnw93dHQqFAl27dsXy5csN+reqiOnYsWMYMGAAbGxs0LlzZ2zevNmgvnfs2IF+/fqhdevWUCqV6NOnD95///1a2xl6zsnt27cxdepUODs7w8bGBt7e3ti0aZNBsZk6thUrViAgIABt27aFra0t+vXrh88//9ygtvXhxx9/xODBg/XeDxXv0drODZk0aRJatWqFa9euITQ0FK1bt8ZLL71Ubf26nHOyb98+9O7dGzY2Nujduzf27t1bx5FRkyFQo5OYmCgAEL7//nshICBAmDBhgu65ffv2CVZWVsKtW7cEDw8PISwsrNbjDR48WBg8eHCt9Z5//nnBzs5OyM7OFgRBEH788UfB2tpamDp1aq1tN2/eLMhkMmHYsGHChx9+KCxfvlzo1KmTYG9vL2RlZdXYNjc3V3B0dBQcHByERYsWCe+9957QrVs3wcvLSwBQa/u6+PHHHwVbW1uhY8eOQmxsrBATEyM4Ozvr+qpNRESE4OHhUWs9Dw8PwdPTU3B1dRUWLVokrF69Wmjfvr3QqlUrYevWrULHjh2FZcuWCcuWLRPs7OyErl27ClqttsZjFhUVCV5eXkLbtm2FN998U0hISBAmTpwoyGQyYdasWQbH5OzsLLz55pvCRx99JPj6+goymUy4cOFCjW0PHTokABCee+45Yc2aNcKaNWuEyMhIYdSoUbX2C0BYuHBhjXUePnwo9OjRQ2jevLnw+uuvCx988IEwaNAgAYAQFxdXr2MTBEHo0KGD8OqrrwofffSRsGrVKmHAgAECAOGrr76qta2hvxOGunnzptCmTRuhbdu2wuLFi4UVK1YI3bt3F7y9vQ16P0RERAgKhULo0qWLEBERISQkJAibN2+utn7F35vajpucnCxYWVkJvXv3FlatWiX8z//8j2BnZyf06tXLrOOnxoHJSSP05+Tko48+Elq3bi08fPhQEARBGDVqlBAUFCQIgmD25CQ3N1do06aNMGTIEKG4uFjo27ev0LFjR6GgoKDGdg8ePBDs7e2F6dOn65Wr1WrBzs6uUvlfzZ49WwAgnDx5Uld2+/Ztwc7OzuzJSXh4uGBjYyPcuHFDV/bzzz8Lcrnc7MkJAOH48eO6suTkZAGAYGtrq9f/2rVrBQDCt99+W+MxY2JihJYtWwq//PKLXvm8efMEuVyuSypri+no0aO6stu3bwsKhUJ44403amw7a9YsQalUCqWlpTXWq4ohyUlcXJwAQNi6dauurKSkRPD39xdatWolaDSaGtubMjZBEHTvrz/33bt3b+HZZ5+tta25k5N//etfgkwmE86dO6cru3fvntCmTRuDkxMAwrx58wzqz9DkxMfHR3B1dRXy8/N1ZRVJK5MT+isu6zRyo0ePxqNHj/DVV1/hwYMH+Oqrr+q0pFMXLi4uWLNmDVJSUjBo0CBkZmZi48aNUCqVNbZLSUlBfn4+xo0bh7t37+o2uVwOPz8/fPvttzW2P3DgAP72t79hwIABujJHR8cap6KNodVqkZycjPDwcHTs2FFX3qNHD4SEhJi1LwDo2bMn/P39dft+fn4AgGeffVav/4ryX3/9tcbjffbZZxg0aBAcHBz0/p2Dg4Oh1Wpx9OhRg2IaNGiQbt/R0RGenp619m1vb4+ioiK9JUZzOnDgAFxcXDBu3DhdWfPmzfHaa6+hsLAQR44cqfUYxo4NAGxtbXU/379/HwUFBRg0aBDOnj1bx5GY7uDBg/D394ePj4+urE2bNnV+P8yYMcNsMeXm5iIzMxMRERGws7PTlQ8ZMgQ9e/Y0Wz/UePAss0bO0dERwcHB2LZtGx4+fAitVot//OMf9dbf2LFjsXXrVuzfvx8vv/wynnvuuVrbXLlyBUD5h25Vaktubty4ofuA/jNPT89a+3706BEKCgr0yqo7UfjOnTt49OgRunXrVmVfhpxXUxd/TkAA6P6ou7u7V1l+//79Go935coV/Pjjj3B0dKzy+du3b9c5JgBwcHCote9XX30Vu3btwvDhw9G+fXsMHToUo0ePxrBhw2rt0xA3btxAt27dYGWl//+tHj166J6vjbFjA4CvvvoKb7/9NjIzM1FcXKwrF+Mk0Rs3bugltRW6du1q8DGaNWuGDh06mDUmANW+d8RI4siyMTlpAl588UVMnz4darUaw4cPh729fb31de/ePZw+fRoA8PPPP6OsrKzSB8ZfVZyMuWXLlioTg/q8UmPnzp2YPHmyXpkgCPXWX13I5fI6ldcWd1lZGYYMGYK5c+dW+fxTTz1ldEy19e3k5ITMzEwkJyfj66+/xtdff43ExERMnDjR4JNW65uxY/vuu+/wf/7P/8Hf//53fPzxx3B1dUXz5s2RmJiIbdu21Ueo9U6hUNT6viWqT0xOmoAXXngB//znP3HixAns3LmzXvuaOXMmHjx4gNjYWERHRyMuLg5RUVE1tunSpQuA8g+w4ODgOvfp4eGhm335s8uXL9faNiQkxOClBkdHR9ja2hrdl9i6dOmCwsJCo/6NzcHa2hojRozAiBEjUFZWhldffRVr167F/Pnz6/S/+qp4eHjgxx9/rJQMX7p0Sfd8fdm9ezdsbGyQnJysd5l4YmJivfVZEw8PD1y9erVSeVVlDaXi31+q7x1qeEyNm4BWrVohPj4eixYtwogRI+qtn88//xw7d+7EsmXLMG/ePIwdOxZvvfUWfvnllxrbhYSEQKlUYunSpXjy5Eml5+/cuVNj+9DQUJw4cQKnTp3Sa/Ppp5/WGrOrqyuCg4P1turI5XKEhIRg3759yM7O1pVfvHgRycnJtfYlttGjRyMjI6PKWPPz8yvdD8ec7t27p7dvZWUFLy8vANBbBjFWaGgo1Gq1XvJdWlqKDz/8EK1atcLgwYNN7qM6crkcMpkMWq1WV3b9+nXs27ev3vqsSUhICDIyMpCZmakr+/333w16P9QXV1dX+Pj4YNOmTXrLqCkpKfj5559Fi4ssF2dOmoiIiIh6Pf7t27cxY8YMBAUFITIyEgDw0Ucf4dtvv8WkSZNw7NixaqeJlUol4uPjMWHCBPj6+mLs2LFwdHREdnY29u/fj2eeeQYfffRRtX3PnTsXW7ZswbBhwzBr1iy0bNkS69at0/1v2pwWL16MgwcPYtCgQXj11Vd1H4C9evUye1/mNmfOHHz55Zd4/vnnMWnSJPTr1w9FRUU4f/48Pv/8c1y/fh3t2rWrl76nTZuG33//Hc8++yw6dOiAGzdu4MMPP4SPj4/uvBBTvPzyy1i7di0mTZqEM2fOoFOnTvj888+Rnp6OuLg4tG7d2gyjqFpYWBhWrVqFYcOG4cUXX8Tt27exZs0adO3aVZTfiblz52Lr1q0YMmQI/vWvf6Fly5ZYv349OnbsiN9//120m6XFxsYiLCwMAwcOxJQpU/D777/r3juFhYWixESWizMnZBYzZsxAcXGx7kZPANC2bVusW7cOGRkZWLFiRY3tX3zxRaSmpqJ9+/Z47733MGvWLOzYsQM+Pj6Vzgn5K1dXV3z77bfw8vLCsmXLEBcXh4kTJ2LWrFlmG18FLy8vJCcnw9HREQsWLMDGjRuxePFivPDCC2bvy9xatGiBI0eOYM6cOUhLS8OsWbOwbNkyXLlyBYsXL9a7isLcxo8fDxsbG3z88cd49dVXsWnTJowZMwZff/21Wc5tsLW1RVpaGl566SVs2rQJb7zxBn7//XckJibWy+/Bnz377LPYsGED1Go1Zs+eje3bt2P58uWi/U64u7vj22+/RY8ePbB06VLExcUhIiICU6ZMAVB+x10xDBs2DJ999hm0Wi2io6OxZ88eJCYmon///qLEQ5ZNJljK2X9ERFRvZs+ejbVr16KwsLDak3+JLAVnToiIGplHjx7p7d+7dw9btmzBwIEDmZiQJPCcEyKiRsbf3x+BgYHo0aMH8vLysGHDBmg0GsyfP1/s0IgMwuSEiKiRCQ0Nxeeff45169ZBJpPB19cXGzZswN///nexQyMyiKjLOrGxsXj66afRunVrODk5ITw83KBr3j/77DN0794dNjY26NOnT6U7cwqCgAULFsDV1RW2trYIDg6u8vp6IqLGaOnSpfjll1/w8OFDFBUV4bvvvhPt/jZExhA1OTly5AhmzpyJEydOICUlBU+ePMHQoUNRVFRUbZvjx49j3LhxmDp1Ks6dO4fw8HCEh4fjwoULujrvvvsuPvjgAyQkJODkyZNo2bIlQkJC8Pjx44YYFhEREZnAoq7WuXPnDpycnHDkyJFqpx/HjBmDoqIifPXVV7qyv/3tb/Dx8UFCQgIEQYCbmxveeOMN/Pvf/wYAFBQUwNnZGUlJSRg7dmyDjIWIiIiMY1HnnFTcObBNmzbV1snIyKh0O/SKu3YCQFZWFtRqtd4Upp2dHfz8/JCRkVFlclJcXKx3l8qysjL8/vvvaNu2rWg3LCIiImkQBAEPHjyAm5tbvX4n0ePHj1FSUmLycaytrUW7342hLCY5KSsrw+zZs/HMM8+gd+/e1dZTq9VwdnbWK3N2doZardY9X1FWXZ2/io2NxeLFi00Jn4iImricnByzfpvznz1+/BiOtrYwx710XVxckJWVZdEJisUkJzNnzsSFCxdw7NixBu87OjpabzamoKAAHTt2xPtjAZ/K36IuGYd+At7ZD6xbCHh2Ejsa4xzKAN5ZB8xb1wEenoraG1iok4ceIOmd23h23f+DvWf93CK+vmUfuoLT73wD649WwapbF7HDMVrpN0dQunwVMGwd0NZT7HCM9+shIOMdAOsASHUchwC8A2AEgLYix2IKNYCD9fo1CSUlJSgE8DoAU/4SFgNYrVajpKSEyUltIiMj8dVXX+Ho0aO1Zp0uLi7Iy8vTK8vLy4OLi4vu+YoyV1dXvTo+Pj5VHlOhUOh9m2gFn47A32v/FnmLlfN7+WO/noBvT3FjMVbOH5Nd3fu1gKdvC3GDMUFeTvkXGjr2aw8n3/r5n1V9e5BTvuwq9/GCvK+3yNEYT7j5G0oBwLUf4OIrdjjG0+T88UM/AFIdR8UYXAG4iRmIWTTEaQAtAZiSUljEh74BRL1aRxAEREZGYu/evfjmm2+gUqlqbePv74/U1FS9spSUFPj7+wMAVCoVXFxc9OpoNBqcPHlSV4eIiEiKmpthkwJRk6iZM2di27Zt+OKLL9C6dWvdOSF2dnawtbUFAEycOBHt27dHbGwsAGDWrFkYPHgwVq5cibCwMOzYsQOnT5/GunXrAJRnrrNnz8bbb7+Nbt26QaVSYf78+XBzc0N4eLgo4yQiIjKHZjDtg1sqMyeixhkfHw8ACAwM1CtPTEzEpEmTAADZ2dl6Zz8HBARg27ZteOutt/Dmm2+iW7du2Ldvn95JtHPnzkVRURFefvll5OfnY+DAgTh48KBFr68RERFROVGTE0NusZKWllapbNSoURg1alS1bWQyGZYsWYIlS5aYEh4REZFFaQbTlmZKzRVIPZPKDA8REVGT11SWdUQ9IZaIiIjor6SSRBERETV5pl5xw2UdIiIiMisu6xARERGJQCpJFBERUZNn6tU6T8wVSD1jckJERCQRXNYhIiIiEoFUkigiIqImz9SrdfjdOkRERGRWTE6IiIjIovCcEyIiIiIRSCWJIiIiavJMvZRYKh/6nDkhIiKSiGZm2OrqwYMHmD17Njw8PGBra4uAgAB8//33NbZJS0uDr68vFAoFunbtiqSkpDr1yeSEiIiIqjVt2jSkpKRgy5YtOH/+PIYOHYrg4GDcunWryvpZWVkICwtDUFAQMjMzMXv2bEybNg3JyckG98nkhIiISCKam2Gri0ePHmH37t1499138fe//x1du3bFokWL0LVrV8THx1fZJiEhASqVCitXrkSPHj0QGRmJf/zjH1i9erXB/TI5ISIikoiGXtYpLS2FVquFjY2NXrmtrS2OHTtWZZuMjAwEBwfrlYWEhCAjI8PgfpmcEBERNTEajUZvKy4urrJe69at4e/vj5iYGPz222/QarXYunUrMjIykJubW2UbtVoNZ2dnvTJnZ2doNBo8evTIoPiYnBAREUlExdU6xm4VMyfu7u6ws7PTbbGxsdX2uWXLFgiCgPbt20OhUOCDDz7AuHHjYGVVfymEVK4qIiIiavLMdRO2nJwcKJVKXblCoai2TZcuXXDkyBEUFRVBo9HA1dUVY8aMQefOnaus7+Ligry8PL2yvLw8KJVK2Nra1ilOIiIiaiKUSqVecmKIli1bomXLlrh//z6Sk5Px7rvvVlnP398fBw4c0CtLSUmBv7+/wX1xWYeIiEgiGvpqHQBITk7GwYMHkZWVhZSUFAQFBaF79+6YPHkyACA6OhoTJ07U1X/llVfw66+/Yu7cubh06RI+/vhj7Nq1C6+//rrBfTI5ISIikggxbsJWUFCAmTNnonv37pg4cSIGDhyI5ORkNG9enurk5uYiOztbV1+lUmH//v1ISUmBt7c3Vq5cifXr1yMkJKRO4yQiIiIJEOP29aNHj8bo0aOrfb6qu78GBgbi3LlzRvRWjjMnREREZFE4c0JERCQRxp438uf2UsDkhIiISCLMdSmxpeOyDhEREVkUqSRRRERETV4zOdBcZkJ7AYDWbOHUGyYnREREEtGsGdCsCSQnXNYhIiIii8KZEyIiIolobuKyTnPBfLHUJyYnREREEmGWZR0J4LIOERERWRTOnBAREUlEcznQ3IRpheZl5oulPok6c3L06FGMGDECbm5ukMlk2LdvX431J02aBJlMVmnr1auXrs6iRYsqPd+9e/d6HgkREVEDkJthkwBRk5OioiJ4e3tjzZo1BtV///33kZubq9tycnLQpk0bjBo1Sq9er1699OodO3asPsInIiJqWGJ8LbEIRA1z+PDhGD58uMH17ezsYGdnp9vft28f7t+/j8mTJ+vVa9asGVxcXMwWJxERETUcieRQVduwYQOCg4Ph4eGhV37lyhW4ubnBxsYG/v7+iI2NRceOHas9TnFxMYqLi3X7Go0GAHBZDbRS1E/sDSHrbvnjxV/FjcMUWbfKH69ffCxuICb6LasEAHD/4m2RIzHeg6zfAQBll6+IHIlpym5kl/9w96K4gZgqP+uPH6Q8joox3BU1CtPda7iumsG0NQ+JnHMiEwTBIi4skslk2Lt3L8LDww2q/9tvv6Fjx47Ytm0bRo8erSv/+uuvUVhYCE9PT+Tm5mLx4sW4desWLly4gNatW1d5rEWLFmHx4sXmGAYRETVRBQUFUCqV9XJsjUYDOzs7FHQClCYkJ5oywO56/cZqDpKdOdm0aRPs7e0rJTN/Xiby8vKCn58fPDw8sGvXLkydOrXKY0VHRyMqKkq3r9Fo4O7ujv/xBXrY10f0DSNdDcT/DMRMBFTOYkdjnPSfgfj9wL9iHNBeJZUv+67sXPoj7Ix/gGdinoNS5SB2OEb5Lf0Gfoj/HopF/4FVJ3exwzFa6fHv8WTdJiAwBrBXiR2O8XLSgTPxAGIASHUc6QDiAQQBkOb7otwdAN+JHUSjIsnkRBAEbNy4ERMmTIC1tXWNde3t7fHUU0/h6tWr1dZRKBRQKCqv3wztAPzdzeRwRRX/MxDaH/DtKnYkxovfDwwKbYmevhJeYwOwM/4BVKFPwdlXur9UP8R/j+bDnoW8r5fYoZjkybpNQNdQwNVX7FBMcyYeQCgAKY8jHkA3ANJ9XwDX0WDJiRUkc8WNKSR5E7YjR47g6tWr1c6E/FlhYSGuXbsGV1fXBoiMiIioHjWRq3VETU4KCwuRmZmJzMxMAEBWVhYyMzORnV1+wlp0dDQmTpxYqd2GDRvg5+eH3r17V3ru3//+N44cOYLr16/j+PHjeOGFFyCXyzFu3Lh6HQsRERGZh6g51OnTpxEUFKTbrzjvIyIiAklJScjNzdUlKhUKCgqwe/duvP/++1Ue8+bNmxg3bhzu3bsHR0dHDBw4ECdOnICjo2P9DYSIiKghNINpyzomfC9PQxI1OQkMDERNFwslJSVVKrOzs8PDhw+rbbNjxw5zhEZERGR5JHSXV1NI8pwTIiIiarwkcmoMERERcVmHiIiILIscTeKTuwkMkYiIqJEw9ZwTi7gnfO14zgkRERFZFM6cEBERSYWEbqRmiiYwRCIiokaiiSQnXNYhIiIii9IE8i8iIqJGoonMnDSBIRIRETUSpn4rcZm5AqlfXNYhIiIii8KZEyIiIqkwdVlHIvc5YXJCREQkFU0kOeGyDhEREVVJq9Vi/vz5UKlUsLW1RZcuXRATEwNBqD7LSUtLg0wmq7Sp1WqD++XMCRERkVSYevv6Op4Qu3z5csTHx2PTpk3o1asXTp8+jcmTJ8POzg6vvfZajW0vX74MpVKp23dycjK4XyYnREREUtHAyzrHjx/HyJEjERYWBgDo1KkTtm/fjlOnTtXa1snJCfb29kYEyWUdIiIi6aj4VmJjtzrOugQEBCA1NRW//PILAOCHH37AsWPHMHz48Frb+vj4wNXVFUOGDEF6enqd+uXMCRERUROj0Wj09hUKBRQKRaV68+bNg0ajQffu3SGXy6HVavHOO+/gpZdeqvbYrq6uSEhIQP/+/VFcXIz169cjMDAQJ0+ehK+vr0HxMTkhIiKSClPPOfmjrbu7u17xwoULsWjRokrVd+3ahU8//RTbtm1Dr169kJmZidmzZ8PNzQ0RERFVduHp6QlPT0/dfkBAAK5du4bVq1djy5YtBoXJ5ISIiEgqTD3n5I8TYnNycvROVq1q1gQA5syZg3nz5mHs2LEAgD59+uDGjRuIjY2tNjmpyoABA3Ds2DGD6zM5ISIiamKUSqVeclKdhw8fwspK//RUuVyOsrK6XfaTmZkJV1dXg+szOSEiIpIKM82cGGrEiBF455130LFjR/Tq1Qvnzp3DqlWrMGXKFF2d6Oho3Lp1C5s3bwYAxMXFQaVSoVevXnj8+DHWr1+Pb775BocOHTK4XyYnREREUtHAycmHH36I+fPn49VXX8Xt27fh5uaGf/7zn1iwYIGuTm5uLrKzs3X7JSUleOONN3Dr1i20aNECXl5eOHz4MIKCggzul8kJERERVal169aIi4tDXFxctXWSkpL09ufOnYu5c+ea1C+TEyIiIqmwgmlX60jk7mZMToiIiKTC1GUdrbkCqV8SyaGIiIioqeDMCRERkVQ0kZkTJidERERSYaY7xFo6JidERERS0URmTnjOCREREVkUzpwQERFJhRymfXKXmiuQ+sXkhIiISCpMXdaRyKc+l3WIiIjIokgkhyIiIqKmcrWOqDMnR48exYgRI+Dm5gaZTIZ9+/bVWD8tLQ0ymazSplar9eqtWbMGnTp1go2NDfz8/HDq1Kl6HAUREVEDaWaGTQJETU6Kiorg7e2NNWvW1Knd5cuXkZubq9ucnJx0z+3cuRNRUVFYuHAhzp49C29vb4SEhOD27dvmDp+IiIjqgag51PDhwzF8+PA6t3NycoK9vX2Vz61atQrTp0/H5MmTAQAJCQnYv38/Nm7ciHnz5pkSLhERkbh4Qqzl8vHxgaurK4YMGYL09HRdeUlJCc6cOYPg4GBdmZWVFYKDg5GRkSFGqEREROZT8a3Exm4S+dSXSA5VztXVFQkJCejfvz+Ki4uxfv16BAYG4uTJk/D19cXdu3eh1Wrh7Oys187Z2RmXLl2q9rjFxcUoLi7W7Ws0GgDA5XygVfN6GUqDyHpQ/ngxR9w4TJGVV/7468UScQMx0a2sJwCA3y/eETkS42my7gMAtJeuiByJacqu//GGuHtR3EBMlZ/1xw9SHkfFGO6KGoXp7okdQKMjqeTE09MTnp6euv2AgABcu3YNq1evxpYtW4w+bmxsLBYvXlyp/OWjRh/Soox/T+wITDdvfOM4Z+jA+M/FDsFkjyZFih2CeewbL3YEZtIYxrFH7ACko4ks60gkzOoNGDAAx44dAwC0a9cOcrkceXl5enXy8vLg4uJS7TGio6MRFRWl29doNHB3d8d4AB71EnXDOA/gSwAxQYDKXuRgjJSeA8SfBqJjmqOjSiLzkVU4la5FYnwpgmIGwUFlJ3Y4RslOv4XT8efQMuYNWKncxQ7HaE/ST+Nx/Fbg2RjAXiV2OMbLSQe+jwcQA0Cq40gHEA8gCICDyLGY4g6A7xqmKyYn0pCZmQlXV1cAgLW1Nfr164fU1FSEh4cDAMrKypCamorIyOr/t6dQKKBQKCqV9wfgXR9BN6AvAYR2BXxdxY7EePGngedCm8HbVyIX6FcjMb4U3UI7w823+kTZ0p2OPwfr0CA09+0jdigmeRy/FegWCrj5ih2Kab6PBxAKyCQ6DgEoT066AXATNxaTXEeDJSdN5D4noiYnhYWFuHr1qm4/KysLmZmZaNOmDTp27Ijo6GjcunULmzdvBgDExcVBpVKhV69eePz4MdavX49vvvkGhw4d0h0jKioKERER6N+/PwYMGIC4uDgUFRXprt4hIiIiyyZqcnL69GkEBQXp9iuWViIiIpCUlITc3FxkZ2frni8pKcEbb7yBW7duoUWLFvDy8sLhw4f1jjFmzBjcuXMHCxYsgFqtho+PDw4ePFjpJFkiIiLJ4bJO/QsMDIQgCNU+n5SUpLc/d+5czJ07t9bjRkZG1riMQ0REJEmmfiuxRJZ1pHuGIRERETVKEpngISIiIi7rEBERkWVpIlfrcFmHiIiILApnToiIiKSCyzpERERkUZpIcsJlHSIiIrIoEsmhiIiICFYw7aRWiUxJMDkhIiKSiiayrCORMImIiKipJCcSmeAhIiKipkIiORQRERE1lZuwMTkhIiKSCi7rEBERUVOm1Woxf/58qFQq2NraokuXLoiJiYEgCDW2S0tLg6+vLxQKBbp27YqkpKQ69SuRHIqIiIggh2mf3HVc1lm+fDni4+OxadMm9OrVC6dPn8bkyZNhZ2eH1157rco2WVlZCAsLwyuvvIJPP/0UqampmDZtGlxdXRESEmJQv0xOiIiIpKKBl3WOHz+OkSNHIiwsDADQqVMnbN++HadOnaq2TUJCAlQqFVauXAkA6NGjB44dO4bVq1cbnJxwWYeIiIiqFBAQgNTUVPzyyy8AgB9++AHHjh3D8OHDq22TkZGB4OBgvbKQkBBkZGQY3C9nToiIiKTCTFfraDQavWKFQgGFQlGp+rx586DRaNC9e3fI5XJotVq88847eOmll6rtQq1Ww9nZWa/M2dkZGo0Gjx49gq2tba1hcuaEiIhIKpqZYQPg7u4OOzs73RYbG1tld7t27cKnn36Kbdu24ezZs9i0aRNWrFiBTZs21eMgOXNCRETU5OTk5ECpVOr2q5o1AYA5c+Zg3rx5GDt2LACgT58+uHHjBmJjYxEREVFlGxcXF+Tl5emV5eXlQalUGjRrAjA5ISIikg4zXa2jVCr1kpPqPHz4EFZW+osscrkcZWVl1bbx9/fHgQMH9MpSUlLg7+9vcJhc1iEiIpIKuRm2OhgxYgTeeecd7N+/H9evX8fevXuxatUqvPDCC7o60dHRmDhxom7/lVdewa+//oq5c+fi0qVL+Pjjj7Fr1y68/vrrBvfLmRMiIiKpaOBLiT/88EPMnz8fr776Km7fvg03Nzf885//xIIFC3R1cnNzkZ2drdtXqVTYv38/Xn/9dbz//vvo0KED1q9fb/BlxEaESURERE1F69atERcXh7i4uGrrVHX318DAQJw7d87ofpmcEBERSUUT+W4diYRJRERETSU54QmxREREZFEkkkMRERGRYAUIJtwhVpDIlASTEyIiIonQNivfTGkvBRLJoYiIiKipkEgORURERE1l5kQiYRIREVGpXIZSucyE9gIAwXwB1RMu6xAREZFF4cwJERGRRGibNYO2mfEzJ9pmAoAn5guonjA5ISIikgitXA6tCcs6Wrk0khNRl3WOHj2KESNGwM3NDTKZDPv27aux/p49ezBkyBA4OjpCqVTC398fycnJenUWLVoEmUymt3Xv3r0eR0FERNQwyiCH1oStrK5fSywSUZOToqIieHt7Y82aNQbVP3r0KIYMGYIDBw7gzJkzCAoKwogRIyp9uVCvXr2Qm5ur244dO1Yf4RMREVE9EHVZZ/jw4Rg+fLjB9f/6rYhLly7FF198gf/93/9F3759deXNmjWDi4uLucIkIiKyCKWQoxQmXK0jgSt1AIlfrVNWVoYHDx6gTZs2euVXrlyBm5sbOnfujJdeegnZ2dkiRUhERGQ+5cszzUzYpLGsI+kTYlesWIHCwkKMHj1aV+bn54ekpCR4enoiNzcXixcvxqBBg3DhwgW0bt26yuMUFxejuLhYt6/RaAAAOQBs63UE9Sv3j8eLd0UNwyRZ+eWPVy6WiRqHqbKzyuO/e/GeyJEY735WAQBAe/GqyJGYpiwrp/yHuxfFDcRU+Vl//HBRCretqEbFGCT8RwoAIN33taWSCYJgEb/WMpkMe/fuRXh4uEH1t23bhunTp+OLL75AcHBwtfXy8/Ph4eGBVatWYerUqVXWWbRoERYvXmxM2ERERACAgoICKJXKejm2RqOBnZ0dLhS0Q2ul8YseDzRl6G13t15jNQdJzpzs2LED06ZNw2effVZjYgIA9vb2eOqpp3D1avX/24uOjkZUVJRuX6PRwN3dHYMAOJoraBFkAzgNIMYbULUSOxrjpN8G4q8Ai98COnmIHY3xjp8A1m4AhsT4w0FlJ3Y4RrmRfgsn48+jVUwUmqncxQ7HaMXpp/Eo/lPg2RjAXiV2OMbLSQe+jwcQA0Cq40gHEA8gCICDyLGY4g6A7xqkp/JlHeOTE60J56s0JMklJ9u3b8eUKVOwY8cOhIWF1Vq/sLAQ165dw4QJE6qto1AooFAoKpV3AdDJhFgtwWkAoe0B37ZiR2K8+CvAsCGAr4/YkZhm7QbAM1SF9r5OYoditJPx52ETGojmvr3FDsUkj+I/BbqFAm6+Yodimu/jAYQCMomOQwDKk5NuANzEjcUk19FQyUlTIWpyUlhYqDejkZWVhczMTLRp0wYdO3ZEdHQ0bt26hc2bNwMoX8qJiIjA+++/Dz8/P6jVagCAra0t7OzK/zf673//GyNGjICHhwd+++03LFy4EHK5HOPGjWv4ARIREZlRU5k5EfVqndOnT6Nv3766y4CjoqLQt29fLFiwAACQm5urd6XNunXrUFpaipkzZ8LV1VW3zZo1S1fn5s2bGDduHDw9PTF69Gi0bdsWJ06cgKOjlBdoiIiIypOTUhM2Xq1jgMDAQNR0Pm5SUpLeflpaWq3H3LFjh4lRERERWabyy4FNmTmRxpWPkr7PCRERETU+kjshloiIqKnSwsqkpRmtGWOpT0xOiIiIJEJr4nkjUklOuKxDREREFoUzJ0RERBJRcdWN8e2lgckJERGRRJSZ+OV9ZbzPCREREVHdceaEiIhIIprKCbFMToiIiCSiqSQnXNYhIiIii8KZEyIiIokw/SZs1X9ljCVhckJERCQRpl9KzOSEiIiIzKj8i/+M/+jmOSdEREQkaZ06dYJMJqu0zZw5s8r6SUlJlera2NjUuV/OnBAREUlEmYlX65TVcVnn+++/h1b73/mWCxcuYMiQIRg1alS1bZRKJS5fvqzbl8nqfuM3JidEREQSYfqlxHVLThwdHfX2ly1bhi5dumDw4MHVtpHJZHBxcTEqvgpc1iEiIqJalZSUYOvWrZgyZUqNsyGFhYXw8PCAu7s7Ro4ciZ9++qnOfXHmhIiISCJKYWXi1TplAACNRqNXrlAooFAoamy7b98+5OfnY9KkSdXW8fT0xMaNG+Hl5YWCggKsWLECAQEB+Omnn9ChQweD4+TMCRERkURUXK1jygYA7u7usLOz022xsbG19r1hwwYMHz4cbm5u1dbx9/fHxIkT4ePjg8GDB2PPnj1wdHTE2rVr6zROzpwQERE1MTk5OVAqlbr92mZNbty4gcOHD2PPnj116qd58+bo27cvrl69Wqd2TE6IiIgkwvQTYsuXdZRKpV5yUpvExEQ4OTkhLCysbv1ptTh//jxCQ0Pr1I7JCRERkUSYKzmpi7KyMiQmJiIiIgLNmumnDRMnTkT79u11y0JLlizB3/72N3Tt2hX5+fl47733cOPGDUybNq1OfTI5ISIiomodPnwY2dnZmDJlSqXnsrOzYWX139NX79+/j+nTp0OtVsPBwQH9+vXD8ePH0bNnzzr1yeSEiIhIIrQmfreOMTMnQ4cOhSBUfX+UtLQ0vf3Vq1dj9erVxoSmh8kJERGRRJj+3Tr84j8iIiIyIy2sTDznRBpf/cf7nBAREZFF4cwJERGRRJh+tY7xbRsSkxMiIiKJaCrJCZd1iIiIyKJw5oSIiEgiTL+UWBozJ0xOiIiIJML0S4nrfp8TMXBZh4iIiCwKZ06IiIgkoqmcEMvkhIiISCJMvwmbNBZMpBElERERNRmiJidHjx7FiBEj4ObmBplMhn379tXaJi0tDb6+vlAoFOjatSuSkpIq1VmzZg06deoEGxsb+Pn54dSpU+YPnoiIqIGV/nG1jimbFNQ5OYmIiMDRo0fN0nlRURG8vb2xZs0ag+pnZWUhLCwMQUFByMzMxOzZszFt2jQkJyfr6uzcuRNRUVFYuHAhzp49C29vb4SEhOD27dtmiZmIiEgsFVfrmLJJQZ2jLCgoQHBwMDw8PDB58mRERESgffv2RnU+fPhwDB8+3OD6CQkJUKlUWLlyJQCgR48eOHbsGFavXo2QkBAAwKpVqzB9+nRMnjxZ12b//v3YuHEj5s2bZ1ScRERElqDMxBNiyyQyc1Ln5GTfvn24c+cOtmzZgk2bNmHhwoUIDg7G1KlTMXLkSDRv3rw+4gQAZGRkIDg4WK8sJCQEs2fPBgCUlJTgzJkziI6O1j1vZWWF4OBgZGRkVHvc4uJiFBcX6/Y1Gg0A4B4Aa/OF3+Du//F4sUDUMEySVVj+eOkXceMw1fUb5Y+3L/4ubiAmuJ9V/otUevGqyJGYpjQrp/yHuxfFDcRU+Vl//HAREESNxAQVY7grahSmuyd2AI2OUfM7jo6OiIqKQlRUFM6ePYvExERMmDABrVq1wvjx4/Hqq6+iW7du5o4VarUazs7OemXOzs7QaDR49OgR7t+/D61WW2WdS5cuVXvc2NhYLF68uFL5/5onbNGNTxc7AtNFTBc7AvPYNf6g2CGYLH98lNghmMfu8WJHYCaNYRx7xA5AMngpsQFyc3ORkpKClJQUyOVyhIaG4vz58+jZsyfeffddvP766+aKs15FR0cjKuq/f3A1Gg3c3d0xCICjeGGZLBvAaQAx3oCqldjRGCf9NhB/BVj8FtDJQ+xojHf8BLB2AzAkxh8OKjuxwzHKjfRbOBl/Hq1iotBM5S52OEYrTj+NR/GfAs/GAPYqscMxXk468H08gBgAUh1HOoB4AEEAHESOxRR3AHzXID01lUuJ65ycPHnyBF9++SUSExNx6NAheHl5Yfbs2XjxxRehVCoBAHv37sWUKVPMnpy4uLggLy9PrywvLw9KpRK2traQy+WQy+VV1nFxcan2uAqFAgqFolJ5FwCdzBG4iE4DCG0P+LYVOxLjxV8Bhg0BfH3EjsQ0azcAnqEqtPd1EjsUo52MPw+b0EA09+0tdigmeRT/KdAtFHDzFTsU03wfDyAUkEl0HAJQnpx0A+AmbiwmuY6GSk6aijonJ66urigrK8O4ceNw6tQp+Pj4VKoTFBQEe3t7M4Snz9/fHwcOHNArS0lJgb+/PwDA2toa/fr1Q2pqKsLDwwEAZWVlSE1NRWRkpNnjISIiakilkENuwsyJVC4lrnNysnr1aowaNQo2NjbV1rG3t0dWVla1z1coLCzE1av/PbkuKysLmZmZaNOmDTp27Ijo6GjcunULmzdvBgC88sor+OijjzB37lxMmTIF33zzDXbt2oX9+/frjhEVFYWIiAj0798fAwYMQFxcHIqKinRX7xAREUmV6V/810gvJZ4wYYLZOj99+jSCgoJ0+xXnfURERCApKQm5ubnIzs7WPa9SqbB//368/vrreP/999GhQwesX79edxkxAIwZMwZ37tzBggULoFar4ePjg4MHD1Y6SZaIiIgsk6gpVGBgIASh+mvgqrr7a2BgIM6dO1fjcSMjI7mMQ0REjQ7vc0JEREQWpalcSiyNa4qIiIioyeDMCRERkUSUQg4rXq1DRERElqJ8WceUq3WYnBAREZEZ8ZwTIiIiIhFw5oSIiEgimsrMCZMTIiIiiWgq9znhsg4RERFZFM6cEBERSUQp5JDxUmIiIiKyFFrIYdUELiXmsg4RERFZFCYnREREElFxtY4pW1106tQJMpms0jZz5sxq23z22Wfo3r07bGxs0KdPHxw4cKDO42RyQkREJBENnZx8//33yM3N1W0pKSkAgFGjRlVZ//jx4xg3bhymTp2Kc+fOITw8HOHh4bhw4UKd+mVyQkRERFVydHSEi4uLbvvqq6/QpUsXDB48uMr677//PoYNG4Y5c+agR48eiImJga+vLz766KM69cvkhIiISCJKITd5M1ZJSQm2bt2KKVOmQCaTVVknIyMDwcHBemUhISHIyMioU1+8WoeIiEgiytDMpC/+K/ujrUaj0StXKBRQKBQ1tt23bx/y8/MxadKkauuo1Wo4OzvrlTk7O0OtVtcpTs6cEBERSYS5zjlxd3eHnZ2dbouNja217w0bNmD48OFwc3Or72Fy5oSIiKipycnJgVKp1O3XNmty48YNHD58GHv27KmxnouLC/Ly8vTK8vLy4OLiUqf4OHNCREQkEVpYmThzUv6xr1Qq9bbakpPExEQ4OTkhLCysxnr+/v5ITU3VK0tJSYG/v3+dxsmZEyIiIokoP6G1YW9fX1ZWhsTERERERKBZM/20YeLEiWjfvr1uWWjWrFkYPHgwVq5cibCwMOzYsQOnT5/GunXr6tQnZ06IiIioWocPH0Z2djamTJlS6bns7Gzk5ubq9gMCArBt2zasW7cO3t7e+Pzzz7Fv3z707t27Tn1y5oSIiEgitGgGmUnfrVP3tkOHDoUgCFU+l5aWVqls1KhR1d6kzVBMToiIiCSizIi7vP61vRRwWYeIiIgsCmdOiIiIJEJr4gmxpsy6NCQmJ0RERBLRVJITLusQERGRReHMCRERkUSUwgqCSTMn0piTYHJCREQkEeWXAjfspcRikEaURERExHNOiIiIiMTAmRMiIiKJKDNx5kQqN2FjckJERCQRpZDDqgkkJ1zWISIiIotiEcnJmjVr0KlTJ9jY2MDPzw+nTp2qtm5gYCBkMlmlLSwsTFdn0qRJlZ4fNmxYQwyFiIio3mghhxbNTNikMXMi+rLOzp07ERUVhYSEBPj5+SEuLg4hISG4fPkynJycKtXfs2cPSkpKdPv37t2Dt7d3pW9AHDZsGBITE3X7CoWi/gZBRETUALSQm3SfEy7rGGjVqlWYPn06Jk+ejJ49eyIhIQEtWrTAxo0bq6zfpk0buLi46LaUlBS0aNGiUnKiUCj06jk4ODTEcIiIiMhEos6clJSU4MyZM4iOjtaVWVlZITg4GBkZGQYdY8OGDRg7dixatmypV56WlgYnJyc4ODjg2Wefxdtvv422bdtWeYzi4mIUFxfr9jUaDQDgHgDrOo7Jktz/4/FigahhmCSrsPzx0i/ixmGq6zfKH29f/F3cQExwP6v8F6n04lWRIzFNaVZO+Q93L4obiKnys/744SIgiBqJCSrGcFfUKEx3r8F6aiozJzJBEET7tf7tt9/Qvn17HD9+HP7+/rryuXPn4siRIzh58mSN7U+dOgU/Pz+cPHkSAwYM0JXv2LEDLVq0gEqlwrVr1/Dmm2+iVatWyMjIgFxe+YVZtGgRFi9ebL6BERFRk1NQUAClUlkvx9ZoNLCzs4PD/YuwUrY2+jhlmge479CjXmM1B9HPOTHFhg0b0KdPH73EBADGjh2r+7lPnz7w8vJCly5dkJaWhueee67ScaKjoxEVFaXb12g0cHd3x3gAHvUWff07D+BLADFBgMpe5GCMlJ4DxJ8GomOao6NK9FVIo51K1yIxvhRBMYPgoLITOxyjZKffwun4c2gZ8wasVO5ih2O0J+mn8Th+K/BsDGCvEjsc4+WkA9/HA4gBINVxpAOIBxAEQMpL73cAfCd2EI2KqMlJu3btIJfLkZeXp1eel5cHFxeXGtsWFRVhx44dWLJkSa39dO7cGe3atcPVq1erTE4UCkWVJ8z2B+Bd69Et25cAQrsCvq5iR2K8+NPAc6HN4O0rjenI6iTGl6JbaGe4+db8u23JTsefg3VoEJr79hE7FJM8jt8KdAsF3HzFDsU038cDCAVkEh2HAJQnJ90AuIkbi0muo6GSE22pHGWlxv8tFExo25BE/a+otbU1+vXrh9TUVF1ZWVkZUlNT9ZZ5qvLZZ5+huLgY48ePr7Wfmzdv4t69e3B1lfAnNBERNXna0mYmb1IgepRRUVGIiIhA//79MWDAAMTFxaGoqAiTJ08GAEycOBHt27dHbGysXrsNGzYgPDy80kmuhYWFWLx4Mf7f//t/cHFxwbVr1zB37lx07doVISEhDTYuIiIic9OWWkFm0syJNJbHRU9OxowZgzt37mDBggVQq9Xw8fHBwYMH4ezsDADIzs6GlZX+P+bly5dx7NgxHDp0qNLx5HI5fvzxR2zatAn5+flwc3PD0KFDERMTw3udEBERSYDoyQkAREZGIjIyssrn0tLSKpV5enqiuouMbG1tkZycbM7wiIiILIK2VG7izIk0zjmxiOSEiIiIaldaKofsSeNPTqSx+ERERERNBmdOiIiIJELQNoOgNeGj25S2DUgaURIRERFQKi/fTGkvAVzWISIiIovCmRMiIiKpaCIzJ0xOiIiIpEIrA0plprWXAC7rEBERkUXhzAkREZFUlP6xmdJeApicEBERSQWTEyIiIrIoTSQ54TknREREZFGYnBAREUlFKYAnJmxGzJzcunUL48ePR9u2bWFra4s+ffrg9OnT1dZPS0uDTCartKnVaoP75LIOERGRVGj/2ExpXwf379/HM888g6CgIHz99ddwdHTElStX4ODgUGvby5cvQ6lU6vadnJwM7pfJCREREVVp+fLlcHd3R2Jioq5MpVIZ1NbJyQn29vZG9ctlHSIiIqkoNcNWB19++SX69++PUaNGwcnJCX379sUnn3xiUFsfHx+4urpiyJAhSE9Pr1O/TE6IiIikwkzJiUaj0duKi4ur7O7XX39FfHw8unXrhuTkZMyYMQOvvfYaNm3aVG2Irq6uSEhIwO7du7F79264u7sjMDAQZ8+eNXiYXNYhIiJqYtzd3fX2Fy5ciEWLFlWqV1ZWhv79+2Pp0qUAgL59++LChQtISEhARERElcf29PSEp6enbj8gIADXrl3D6tWrsWXLFoPiY3JCREQkFWa6z0lOTo7eyaoKhaLK6q6urujZs6deWY8ePbB79+46dTtgwAAcO3bM4PpMToiIiKRCC9OSkz+u1lEqlXrJSXWeeeYZXL58Wa/sl19+gYeHR526zczMhKurq8H1mZwQERFRlV5//XUEBARg6dKlGD16NE6dOoV169Zh3bp1ujrR0dG4desWNm/eDACIi4uDSqVCr1698PjxY6xfvx7ffPMNDh06ZHC/TE6IiIikooFvX//0009j7969iI6OxpIlS6BSqRAXF4eXXnpJVyc3NxfZ2dm6/ZKSErzxxhu4desWWrRoAS8vLxw+fBhBQUEG98vkhIiISCpE+G6d559/Hs8//3y1zyclJentz507F3Pnzq17R3/C5ISIiEgqKm5Db0p7CeB9ToiIiMiicOaEiIhIKhr4u3XEwuSEiIhIKsx0KbGl47IOERERWRTOnBAREUmFCFfriIHJCRERkVQ0keSEyzpERERkUThzQkREJBVNZOaEyQkREZFU8GodIiIioobHmRMiIiKpaCLLOhYxc7JmzRp06tQJNjY28PPzw6lTp6qtm5SUBJlMprfZ2Njo1REEAQsWLICrqytsbW0RHByMK1eu1PcwiIiI6tcTM2wSIHpysnPnTkRFRWHhwoU4e/YsvL29ERISgtu3b1fbRqlUIjc3V7fduHFD7/l3330XH3zwARISEnDy5Em0bNkSISEhePz4cX0Ph4iIqP5ozbBJgOjJyapVqzB9+nRMnjwZPXv2REJCAlq0aIGNGzdW20Ymk8HFxUW3OTs7654TBAFxcXF46623MHLkSHh5eWHz5s347bffsG/fvgYYEREREZlC1HNOSkpKcObMGURHR+vKrKysEBwcjIyMjGrbFRYWwsPDA2VlZfD19cXSpUvRq1cvAEBWVhbUajWCg4N19e3s7ODn54eMjAyMHTu20vGKi4tRXFys29doNACAHAC2pg5SRLl/PF68K2oYJsnKL3+8crFM1DhMlZ1VHv/di/dEjsR497MKAADai1dFjsQ0ZVk55T/cvShuIKbKz/rjh4uAIGokJqgYg4T/SAEAGvB93UTOORE1Obl79y60Wq3ezAcAODs749KlS1W28fT0xMaNG+Hl5YWCggKsWLECAQEB+Omnn9ChQweo1WrdMf56zIrn/io2NhaLFy+uVL7SmEFZoPF7xY7AdDPGF9deSQL2jP9K7BBMphk/W+wQzGP3eLEjMJPGMI49YgcgHU3kUmLJXa3j7+8Pf39/3X5AQAB69OiBtWvXIiYmxqhjRkdHIyoqSrev0Wjg7u6O//EFetibGrF40tVA/M9AzERA5Vx7fUuU/jMQvx/4V4wD2quaix2O0c6lP8LO+Ad4JuY5KFUOYodjlN/Sb+CH+O+hWPQfWHVyFzsco5Ue/x5P1m0CAmMAe5XY4RgvJx04Ew8gBoBUx5EOIB5AEABpvi/K3QHwndhBNCqiJift2rWDXC5HXl6eXnleXh5cXFwMOkbz5s3Rt29fXL1aPtVc0S4vLw+urq56x/Tx8anyGAqFAgqFolL50A7A390MCsNixf8MhPYHfLuKHYnx4vcDg0Jboqdv5ddISnbGP4Aq9Ck4+0r3l+qH+O/RfNizkPf1EjsUkzxZtwnoGgq4+oodimnOxAMIBSDlccQD6AZAuu8L4DoaLDkpBSA3sb0EiHpCrLW1Nfr164fU1FRdWVlZGVJTU/VmR2qi1Wpx/vx5XSKiUqng4uKid0yNRoOTJ08afEwiIiKL1EQuJRZ9WScqKgoRERHo378/BgwYgLi4OBQVFWHy5MkAgIkTJ6J9+/aIjY0FACxZsgR/+9vf0LVrV+Tn5+O9997DjRs3MG3aNADlV/LMnj0bb7/9Nrp16waVSoX58+fDzc0N4eHhYg2TiIiIDCR6cjJmzBjcuXMHCxYsgFqtho+PDw4ePKg7oTU7OxtWVv+d4Ll//z6mT58OtVoNBwcH9OvXD8ePH0fPnj11debOnYuioiK8/PLLyM/Px8CBA3Hw4MFKN2sjIiKSFFPvVcITYg0XGRmJyMjIKp9LS0vT21+9ejVWr15d4/FkMhmWLFmCJUuWmCtEIiIi8TWRq3VEvwkbERER0Z9ZxMwJERERGaAUpk0rSORqHSYnREREUvEEgMzE9hLA5ISIiEgqmsgJsTznhIiIiCwKZ06IiIikguecEBERkUXhpcREREREDY8zJ0RERFJh6tU2vFqHiIiIzEoL09Y8uKxDREREVHecOSEiIpKKUph2EzaJXK3DmRMiIiKpKDXDVke3bt3C+PHj0bZtW9ja2qJPnz44ffp0jW3S0tLg6+sLhUKBrl27IikpqU59MjkhIiKiKt2/fx/PPPMMmjdvjq+//ho///wzVq5cCQcHh2rbZGVlISwsDEFBQcjMzMTs2bMxbdo0JCcnG9wvl3WIiIikwtRlmTq2X758Odzd3ZGYmKgrU6lUNbZJSEiASqXCypUrAQA9evTAsWPHsHr1aoSEhBjUL2dOiIiIpEJrhq0OvvzyS/Tv3x+jRo2Ck5MT+vbti08++aTGNhkZGQgODtYrCwkJQUZGhsH9MjkhIiKSCjOdc6LRaPS24uLiKrv79ddfER8fj27duiE5ORkzZszAa6+9hk2bNlUbolqthrOzs16Zs7MzNBoNHj16ZNAwmZwQERE1Me7u7rCzs9NtsbGxVdYrKyuDr68vli5dir59++Lll1/G9OnTkZCQUK/x8ZwTIiIiqTDTOSc5OTlQKpW6YoVCUWV1V1dX9OzZU6+sR48e2L17d7VduLi4IC8vT68sLy8PSqUStra2BoXJ5ISIiEgqSgEIJrT/45wTpVKpl5xU55lnnsHly5f1yn755Rd4eHhU28bf3x8HDhzQK0tJSYG/v7/BYXJZh4iIiKr0+uuv48SJE1i6dCmuXr2Kbdu2Yd26dZg5c6auTnR0NCZOnKjbf+WVV/Drr79i7ty5uHTpEj7++GPs2rULr7/+usH9MjkhIiKSiga+Wufpp5/G3r17sX37dvTu3RsxMTGIi4vDSy+9pKuTm5uL7Oxs3b5KpcL+/fuRkpICb29vrFy5EuvXrzf4MmKAyzpERETSYaZlnbp4/vnn8fzzz1f7fFV3fw0MDMS5c+fq3tkfOHNCREREFoUzJ0RERFIhwsyJGJicEBERSUUpgDIT2pvStgFxWYeIiIgsCmdOiIiIpEIL05Z1JDJzwuSEiIhIKkph2poHkxMiIiIyqyaSnPCcEyIiIrIonDkhIiKSiidoEjMnTE6IiIikogymnRBrStsGxGUdIiIisiicOSEiIpKKUgAyE9pz5sRwa9asQadOnWBjYwM/Pz+cOnWq2rqffPIJBg0aBAcHBzg4OCA4OLhS/UmTJkEmk+ltw4YNq+9hEBER1a9SM2wSIHpysnPnTkRFRWHhwoU4e/YsvL29ERISgtu3b1dZPy0tDePGjcO3336LjIwMuLu7Y+jQobh165ZevWHDhiE3N1e3bd++vSGGQ0RERCYSPTlZtWoVpk+fjsmTJ6Nnz55ISEhAixYtsHHjxirrf/rpp3j11Vfh4+OD7t27Y/369SgrK0NqaqpePYVCARcXF93m4ODQEMMhIiKqP0/MsEmAqMlJSUkJzpw5g+DgYF2ZlZUVgoODkZGRYdAxHj58iCdPnqBNmzZ65WlpaXBycoKnpydmzJiBe/fumTV2IiKiBqc1wyYBop4Qe/fuXWi1Wjg7O+uVOzs749KlSwYd4z//+Q/c3Nz0Epxhw4bh//7f/wuVSoVr167hzTffxPDhw5GRkQG5XF7pGMXFxSguLtbtazQaAMDlfKBVcyMGZiGyHpQ/XswRNw5TZOWVP/56sUTcQEx0K6v8vyu/X7wjciTG02TdBwBoL10RORLTlF3/4w1x96K4gZgqP+uPH6Q8joox3BU1CtPxP79mJ4jo1q1bAgDh+PHjeuVz5swRBgwYUGv72NhYwcHBQfjhhx9qrHft2jUBgHD48OEqn1+4cKGA8nOYuXHjxo0bN6O2goICwz8A66igoOCPfgoEQDBhK6j3WM1B1JmTdu3aQS6XIy8vT688Ly8PLi4uNbZdsWIFli1bhsOHD8PLy6vGup07d0a7du1w9epVPPfcc5Wej46ORlRUlG5fo9HA3d0d/xMG9HCtw4AsTPpVID4NiIkEVO3FjsY46eeA+F3AyzEucFNZix2O0X5ML8Ke+Hv4W8xQtFa1qb2BBVKnX8f5+BNoviAaVh4dxQ7HaNoTp1D6SSIwKAawV4kdjvFupgPn4gHEAJDqONIBxAMIAiDl8wLvAPhO7CAaFVGTE2tra/Tr1w+pqakIDw8HAN3JrZGRkdW2e/fdd/HOO+8gOTkZ/fv3r7Wfmzdv4t69e3B1rTrTUCgUUCgUlcqH9gL+/pRhY7FU8WlA6CDAt6fYkRgvfhcQEKqEp28LsUMxyZ74e/AI7Q4n3w5ih2K08/En0Gzoc5D39RY7FJOUfpIIdA0FXHzFDsU05+IBhAKQ8jjiAXQD4CZ2ICa4DiYn5iX61TpRUVH45JNPsGnTJly8eBEzZsxAUVERJk+eDACYOHEioqOjdfWXL1+O+fPnY+PGjejUqRPUajXUajUKCwsBAIWFhZgzZw5OnDiB69evIzU1FSNHjkTXrl0REhIiyhiJiIjIcKLfIXbMmDG4c+cOFixYALVaDR8fHxw8eFB3kmx2djasrP6bQ8XHx6OkpAT/+Mc/9I6zcOFCLFq0CHK5HD/++CM2bdqE/Px8uLm5YejQoYiJialydoSIiIgsi+jJCQBERkZWu4yTlpamt3/9+vUaj2Vra4vk5GQzRUZERGRJTL1ZiTRudCL6sg4RERHRn1nEzAkREREZwtQvyJHGl+swOSEiIpIMLusQERERNTjOnBAREUkGl3WIiIjIopTCtKUZaSQnXNYhIiIii8KZEyIiIsloGifEMjkhIiKSDJ5zQkRERBaF55wQERERNTjOnBAREUlG01jW4cwJERGRZDwxw2a4RYsWQSaT6W3du3evtn5SUlKl+jY2NnUdJGdOiIiIqHq9evXC4cOHdfvNmtWcOiiVSly+fFm3L5PJ6twnkxMiIiLJaPhlnWbNmsHFxcXg+jKZrE71q8JlHSIiIsmouFrH2K3uycmVK1fg5uaGzp0746WXXkJ2dnaN9QsLC+Hh4QF3d3eMHDkSP/30U537ZHJCRETUxGg0Gr2tuLi4ynp+fn5ISkrCwYMHER8fj6ysLAwaNAgPHjyosr6npyc2btyIL774Alu3bkVZWRkCAgJw8+bNOsXHZR0iIiLJMM+yjru7u17pwoULsWjRokq1hw8frvvZy8sLfn5+8PDwwK5duzB16tRK9f39/eHv76/bDwgIQI8ePbB27VrExMQYHCWTEyIiIskwz+3rc3JyoFQqdaUKhcKg1vb29njqqadw9epVg+o3b94cffv2Nbh+BS7rEBERNTFKpVJvMzQ5KSwsxLVr1+Dq6mpQfa1Wi/PnzxtcvwKTEyIiIskoNcNmuH//+984cuQIrl+/juPHj+OFF16AXC7HuHHjAAATJ05EdHS0rv6SJUtw6NAh/Prrrzh79izGjx+PGzduYNq0aXXql8s6REREktGw361z8+ZNjBs3Dvfu3YOjoyMGDhyIEydOwNHREQCQnZ0NK6v/znPcv38f06dPh1qthoODA/r164fjx4+jZ8+edeqXyQkREZFkNOx9Tnbs2FHj82lpaXr7q1evxurVq+saVCVc1iEiIiKLwpkTIiIiyTDP1TqWjskJERGRZDSN5ITLOkRERGRROHNCREQkGQ3/xX9iYHJCREQkGQ17KbFYuKxDREREFoUzJ0RERJLBZR0iIiKyKE9g2kc3r9YhIiIiqjPOnBAREUkGl3WIiIjIovBqnQazZs0adOrUCTY2NvDz88OpU6dqrP/ZZ5+he/fusLGxQZ8+fXDgwAG95wVBwIIFC+Dq6gpbW1sEBwfjypUr9TkEIiKiBlBqhs3yiZ6c7Ny5E1FRUVi4cCHOnj0Lb29vhISE4Pbt21XWP378OMaNG4epU6fi3LlzCA8PR3h4OC5cuKCr8+677+KDDz5AQkICTp48iZYtWyIkJASPHz9uqGERERGRkURPTlatWoXp06dj8uTJ6NmzJxISEtCiRQts3Lixyvrvv/8+hg0bhjlz5qBHjx6IiYmBr68vPvroIwDlsyZxcXF46623MHLkSHh5eWHz5s347bffsG/fvgYcGRERkbk9McNm+URNTkpKSnDmzBkEBwfryqysrBAcHIyMjIwq22RkZOjVB4CQkBBd/aysLKjVar06dnZ28PPzq/aYRERE0tA0lnVEPSH27t270Gq1cHZ21it3dnbGpUuXqmyjVqurrK9Wq3XPV5RVV+eviouLUVxcrNsvKCgAAGRm12EwFuhibvnjmZ+BwofixmKsi1nlj5fOPMSjQq24wZjg+sXyJcU7Z27hSWFxLbUt0/2L5Uut2swfIRQViRyN8bS//HH+We4ZoKRQ3GBMcffiHz+cASDVcVSMIRdAiZiBmKj8s0UQhAboy9S/H9L4+8OrdQDExsZi8eLFlcpn7RAhmHrwcuWhSc6yl2+KHYJZfPPybrFDMFlJZJTYIZjHwZfFjsBMGsM4/lfsAMzi3r17sLOzq5djW1tbw8XFBWr1apOP5eLiAmtrazNEVX9ETU7atWsHuVyOvLw8vfK8vDy4uLhU2cbFxaXG+hWPeXl5cHV11avj4+NT5TGjo6MRFfXfP7j5+fnw8PBAdnZ2vf2iNQSNRgN3d3fk5ORAqVSKHY5RGsMYgMYxjsYwBoDjsCSNYQxA+Wx7x44d0aZNm3rrw8bGBllZWSgpMX2GydraGjY2NmaIqv6ImpxYW1ujX79+SE1NRXh4OACgrKwMqampiIyMrLKNv78/UlNTMXv2bF1ZSkoK/P39AQAqlQouLi5ITU3VJSMajQYnT57EjBkzqjymQqGAQqGoVG5nZyfpN0wFpVIp+XE0hjEAjWMcjWEMAMdhSRrDGIDycybrk42NjcUnFeYi+rJOVFQUIiIi0L9/fwwYMABxcXEoKirC5MmTAQATJ05E+/btERsbCwCYNWsWBg8ejJUrVyIsLAw7duzA6dOnsW7dOgCATCbD7Nmz8fbbb6Nbt25QqVSYP38+3NzcdAkQERERWS7Rk5MxY8bgzp07WLBgAdRqNXx8fHDw4EHdCa3Z2dl62WhAQAC2bduGt956C2+++Sa6deuGffv2oXfv3ro6c+fORVFREV5++WXk5+dj4MCBOHjwYJPJOImIiKRM9OQEACIjI6tdxklLS6tUNmrUKIwaNara48lkMixZsgRLliwxKh6FQoGFCxdWudQjJY1hHI1hDEDjGEdjGAPAcViSxjAGoPGMw5LIhIa59omIiIjIIKLfIZaIiIjoz5icEBERkUVhckJEREQWhckJERERWZQmk5ysWbMGnTp1go2NDfz8/HDq1Kka63/22Wfo3r07bGxs0KdPHxw4cEDveUEQsGDBAri6usLW1hbBwcG4cuVKfQ6hTmP45JNPMGjQIDg4OMDBwQHBwcGV6k+aNAkymUxvGzZsWL2OAajbOJKSkirF+NdLwi39tQgMDKw0BplMhrCwMF0dMV6Lo0ePYsSIEXBzc4NMJjPoW7vT0tLg6+sLhUKBrl27IikpqVKdur7XTFHXMezZswdDhgyBo6MjlEol/P39kZycrFdn0aJFlV6L7t2719sYgLqPIy0trcrfqb9+f5glvxZV/c7LZDL06tVLV0eM1yI2NhZPP/00WrduDScnJ4SHh+Py5cu1trPEzwwpaxLJyc6dOxEVFYWFCxfi7Nmz8Pb2RkhICG7fvl1l/ePHj2PcuHGYOnUqzp07h/DwcISHh+PChQu6Ou+++y4++OADJCQk4OTJk2jZsiVCQkLw+PFjixhDWloaxo0bh2+//RYZGRlwd3fH0KFDcevWLb16w4YNQ25urm7bvn17vcRv7DiA8rtH/jnGGzdu6D1v6a/Fnj179OK/cOEC5HJ5pcvhG/q1KCoqgre3N9asWWNQ/aysLISFhSEoKAiZmZmYPXs2pk2bpvfhbszr25BjOHr0KIYMGYIDBw7gzJkzCAoKwogRI3Du3Dm9er169dJ7LY4dO1Yf4evUdRwVLl++rBenk5OT7jlLfy3ef/99vdhzcnLQpk2bSu+Lhn4tjhw5gpkzZ+LEiRNISUnBkydPMHToUBTV8GWXlviZIXlCEzBgwABh5syZun2tViu4ubkJsbGxVdYfPXq0EBYWplfm5+cn/POf/xQEQRDKysoEFxcX4b333tM9n5+fLygUCmH79u31MIK6j+GvSktLhdatWwubNm3SlUVERAgjR440d6g1qus4EhMTBTs7u2qPJ8XXYvXq1ULr1q2FwsJCXZkYr8WfARD27t1bY525c+cKvXr10isbM2aMEBISots39d/GFIaMoSo9e/YUFi9erNtfuHCh4O3tbb7A6siQcXz77bcCAOH+/fvV1pHaa7F3715BJpMJ169f15WJ/VoIgiDcvn1bACAcOXKk2jqW+JkhdY1+5qSkpARnzpxBcHCwrszKygrBwcHIyMiosk1GRoZefQAICQnR1c/KyoJardarY2dnBz8/v2qP2dBj+KuHDx/iyZMnlb6YKi0tDU5OTvD09MSMGTNw7949s8b+Z8aOo7CwEB4eHnB3d8fIkSPx008/6Z6T4muxYcMGjB07Fi1bttQrb8jXwhi1vS/M8W/T0MrKyvDgwYNK74srV67Azc0NnTt3xksvvYTs7GyRIqyZj48PXF1dMWTIEKSnp+vKpfhabNiwAcHBwfDw8NArF/u1KCgoAIAav9TP0j4zGoNGn5zcvXsXWq1Wdzv8Cs7OzpXWZyuo1eoa61c81uWYpjBmDH/1n//8B25ubnpvjmHDhmHz5s1ITU3F8uXLceTIEQwfPhxardas8VcwZhyenp7YuHEjvvjiC2zduhVlZWUICAjAzZs3AUjvtTh16hQuXLiAadOm6ZU39GthjOreFxqNBo8ePTLL72lDW7FiBQoLCzF69GhdmZ+fH5KSknDw4EHEx8cjKysLgwYNwoMHD0SMVJ+rqysSEhKwe/du7N69G+7u7ggMDMTZs2cBmOdvRkP67bff8PXXX1d6X4j9WpSVlWH27Nl45pln9L4i5a8s7TOjMbCI29dT/Vq2bBl27NiBtLQ0vZNJx44dq/u5T58+8PLyQpcuXZCWlobnnntOjFAr8ff3133jNFD+3Uo9evTA2rVrERMTI2JkxtmwYQP69OmDAQMG6JVL4bVobLZt24bFixfjiy++0DtXY/jw4bqfvby84OfnBw8PD+zatQtTp04VI9RKPD094enpqdsPCAjAtWvXsHr1amzZskXEyIyzadMm2NvbV/pyVrFfi5kzZ+LChQv1fp4LVdboZ07atWsHuVyOvLw8vfK8vDy4uLhU2cbFxaXG+hWPdTmmKYwZQ4UVK1Zg2bJlOHToELy8vGqs27lzZ7Rr1w5Xr141OeaqmDKOCs2bN0ffvn11MUrptSgqKsKOHTsM+qNa36+FMap7XyiVStja2prl9W0oO3bswLRp07Br165K0/F/ZW9vj6eeesqiXouqDBgwQBejlF4LQRCwceNGTJgwAdbW1jXWbcjXIjIyEl999RW+/fZbdOjQoca6lvaZ0Rg0+uTE2toa/fr1Q2pqqq6srKwMqampev8j/zN/f3+9+gCQkpKiq69SqeDi4qJXR6PR4OTJk9Ues6HHAJSfHR4TE4ODBw+if//+tfZz8+ZN3Lt3D66urmaJ+6+MHcefabVanD9/XhejVF4LoPxSw+LiYowfP77Wfur7tTBGbe8Lc7y+DWH79u2YPHkytm/frnc5d3UKCwtx7do1i3otqpKZmamLUSqvBVB+dczVq1cNStob4rUQBAGRkZHYu3cvvvnmG6hUqlrbWNpnRqMg9hm5DWHHjh2CQqEQkpKShJ9//ll4+eWXBXt7e0GtVguCIAgTJkwQ5s2bp6ufnp4uNGvWTFixYoVw8eJFYeHChULz5s2F8+fP6+osW7ZMsLe3F7744gvhxx9/FEaOHCmoVCrh0aNHFjGGZcuWCdbW1sLnn38u5Obm6rYHDx4IgiAIDx48EP79738LGRkZQlZWlnD48GHB19dX6Natm/D48eN6GYMx41i8eLGQnJwsXLt2TThz5owwduxYwcbGRvjpp5/0xmrJr0WFgQMHCmPGjKlULtZr8eDBA+HcuXPCuXPnBADCqlWrhHPnzgk3btwQBEEQ5s2bJ0yYMEFX/9dffxVatGghzJkzR7h48aKwZs0aQS6XCwcPHtTVqe3fRuwxfPrpp0KzZs2ENWvW6L0v8vPzdXXeeOMNIS0tTcjKyhLS09OF4OBgoV27dsLt27frZQzGjGP16tXCvn37hCtXrgjnz58XZs2aJVhZWQmHDx/W1bH016LC+PHjBT8/vyqPKcZrMWPGDMHOzk5IS0vT+x15+PChro4UPjOkrkkkJ4IgCB9++KHQsWNHwdraWhgwYIBw4sQJ3XODBw8WIiIi9Orv2rVLeOqppwRra2uhV69ewv79+/WeLysrE+bPny84OzsLCoVCeO6554TLly9bzBg8PDwEAJW2hQsXCoIgCA8fPhSGDh0qODo6Cs2bNxc8PDyE6dOn19sfLmPHMXv2bF1dZ2dnITQ0VDh79qze8Sz9tRAEQbh06ZIAQDh06FClY4n1WlRcjvrXrSL2iIgIYfDgwZXa+Pj4CNbW1kLnzp2FxMTESset6d9G7DEMHjy4xvqCUH55tKurq2BtbS20b99eGDNmjHD16tV6G4Mx41i+fLnQpUsXwcbGRmjTpo0QGBgofPPNN5WOa8mvhSCUX05ra2srrFu3rspjivFaVDUGAHq/61L5zJAymSAIQr1NyxARERHVUaM/54SIiIikhckJERERWRQmJ0RERGRRmJwQERGRRWFyQkRERBaFyQkRERFZFCYnREREZFGYnBAREZFFYXJCREREFoXJCREREVkUJidEVKM7d+7AxcUFS5cu1ZUdP34c1tbWlb6JlYjIHPjdOkRUqwMHDiA8PBzHjx+Hp6cnfHx8MHLkSKxatUrs0IioEWJyQkQGmTlzJg4fPoz+/fvj/Pnz+P7776FQKMQOi4gaISYnRGSQR48eoXfv3sjJycGZM2fQp08fsUMiokaK55wQkUGuXbuG3377DWVlZbh+/brY4RBRI8aZEyKqVUlJCQYMGAAfHx94enoiLi4O58+fh5OTk9ihEVEjxOSEiGo1Z84cfP755/jhhx/QqlUrDB48GHZ2dvjqq6/EDo2IGiEu6xBRjdLS0hAXF4ctW7ZAqVTCysoKW7ZswXfffYf4+HixwyOiRogzJ0RERGRROHNCREREFoXJCREREVkUJidERERkUZicEBERkUVhckJEREQWhckJERERWRQmJ0RERGRRmJwQERGRRWFyQkRERBaFyQkRERFZFCYnREREZFGYnBAREZFF+f+ByGZIPA3gMQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from porepy.models.fluid_mass_balance import SinglePhaseFlow\n",
    "\n",
    "\n",
    "class SinglePhaseFlowExample1(ModifiedGeometry, SinglePhaseFlow):\n",
    "    def bc_type_fluid_flux(self, sd: pp.Grid) -> pp.BoundaryCondition:\n",
    "        \"\"\"Setting the Dirichlet type on the east boundary, Neumann elsewhere.\"\"\"\n",
    "        domain_sides = self.domain_boundary_sides(sd)\n",
    "        return pp.BoundaryCondition(sd, faces=domain_sides.east, cond=\"dir\")\n",
    "\n",
    "    def bc_values_fluid_flux(self, boundary_grid: pp.BoundaryGrid) -> np.ndarray:\n",
    "        \"\"\"Setting the values of the fluid mass flux.\"\"\"\n",
    "        mass_flux_vals = np.zeros(boundary_grid.num_cells)\n",
    "\n",
    "        domain_sides = self.domain_boundary_sides(boundary_grid)\n",
    "        influx_cells = np.zeros(boundary_grid.num_cells, dtype=bool)\n",
    "        influx_cells[domain_sides.west] = True\n",
    "        # Setting the values on the west boundary where 0.5 < y < 1.5\n",
    "        # \"&\" operator is the elementwise boolean AND\n",
    "        influx_cells &= boundary_grid.cell_centers[1] > 0.5\n",
    "        influx_cells &= boundary_grid.cell_centers[1] < 1.5\n",
    "\n",
    "        mass_flux_vals[influx_cells] = self.fluid.convert_units(-1, \"kg*s^-1\")\n",
    "        return mass_flux_vals\n",
    "\n",
    "    def bc_values_pressure(self, boundary_grid: pp.BoundaryGrid) -> np.ndarray:\n",
    "        pressure_vals = np.zeros(boundary_grid.num_cells)\n",
    "        domain_sides = self.domain_boundary_sides(boundary_grid)\n",
    "        pressure_vals[domain_sides.east] = self.fluid.convert_units(5, \"Pa\")\n",
    "        return pressure_vals\n",
    "\n",
    "model_params = {}\n",
    "single_phase_flow = SinglePhaseFlowExample1(params=model_params)\n",
    "pp.run_time_dependent_model(single_phase_flow)\n",
    "pp.plot_grid(single_phase_flow.mdg, single_phase_flow.pressure_variable, plot_2d=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Dirichlet pressure values of 5 Pa on the east boundary affect the pressure in the whole system, and we observe a pressure drop from the west to the east which corresponds to the flux from the west boundary."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Single-phase fluid\n",
    "We revisit here all the methods to set boundary conditions for the single phase fluid model.\n",
    "\n",
    "Consider the mass balance equation with zero source term:\n",
    "$\\phi \\dfrac{\\partial \\rho}{\\partial t} + \\nabla \\cdot F = 0$, where $\\phi \\frac{\\partial \\rho}{\\partial t}$ is the accumulation term, and $F$ is the fluid mass flux that flows in a cell.\n",
    "\n",
    "There are three ways of how to set boundary conditions for this model. The flowchart below outlines the order of evaluation of the boundary conditions operators. Use it and refer to the specific case below:\n",
    "\n",
    "<img src='img/single_phase_flow_bc.jpg' width=600>\n",
    "\n",
    "## 1. Setting the fluid mass flux\n",
    "We can directly set the values of $F$ on a boundary by:\n",
    "* marking the boundary faces as `neu` in the `bc_type_fluid_flux` method\n",
    "* providing the values of $F$ in `bc_values_fluid_flux`\n",
    "\n",
    "Note that we provide only the normal component of $F$. If cells are marked as `dir` in `bc_type_fluid_flux`, the values of $F$ are computed based on the other types of boundary conditions.\n",
    "\n",
    "We used this type of boundary condition on all but the east boundary in the example above.\n",
    "\n",
    "Pro tip: the no-flux boundary condition can be applied by setting the zero values here.\n",
    "\n",
    "## 2. Setting the Darcy flux\n",
    "The expression for $F$ is the following: $F = -\\dfrac{\\rho}{\\mu}K \\nabla p$, where $\\dfrac{\\rho}{\\mu}$ is the advected quantity and $-K \\nabla p$ is the Darcy flux.\n",
    "\n",
    "In realistic setups, the values of $\\rho$ and $\\mu$ can depend on primary variables. For example, $\\rho = \\rho(p, T)$ and $\\mu = \\mu(T)$ in case of the non-isothermal fluid. \n",
    "It may be convenient to set the boundary condition in terms of the Darcy flux. \n",
    "The boundary values for the advected quantity will be computed automatically using the same constitutive laws as in the interior. \n",
    "This helps prevent inconsistencies between expressions used to calculate these quantities on the boundary versus within the domain, which can cause notorious bugs. \n",
    "The Darcy flux boundary condition is applied by:\n",
    "* ensuring that we do not use the boundary values for $F$ by checking that `bc_type_fluid_flux == dir` for our boundary faces\n",
    "* setting the boundary faces as `neu` in `bc_type_darcy_flux`\n",
    "* setting the values of primary variables that are used to evaluate $\\rho$ and $\\mu$ on the boundary in `bc_values_pressure` and the other methods corresponding to each variable in use\n",
    "* setting the values for the Darcy flux in `bc_values_darcy_flux`\n",
    "\n",
    "We will set this boundary condition at the west side of the domain in the example below.\n",
    "\n",
    "## 3. Setting pressure Dirichlet values\n",
    "Finally, the Darcy flux can be evaluated by the provided pressure values. This is done by:\n",
    "* ensuring that we do not use the boundary values for $F$ by checking that `bc_type_fluid_flux == dir` for our boundary faces\n",
    "* setting the boundary faces as `dir` in `bc_type_darcy_flux`\n",
    "* setting pressure values on the boundary in `bc_values_pressure`\n",
    "\n",
    "We used this type of boundary condition on the east boundary in the example above.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we will run the model with a Darcy flux boundary condition. The setup will use the same values for the boundary conditions as in the example above. To demonstrate the advantage of the Darcy flux boundary condition, we will increase the fluid viscosity $\\mu$ by 10 times and see what will happen: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAicAAAHHCAYAAABk/PjCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABcs0lEQVR4nO3deVxU9f4/8NcwyoDLACqrIo5LuAKiyYX0CoWikD/p97tupeLazeSm0dUrfXOlRMuFFgNNBZfcyqW+aSJSaCJqLpSWmhoKGoNLwggqyHB+fxBzm9iGmYEzB17Px+M8hvOZz+d83h+HYd5+PueckQmCIICIiIjIQliJHQARERHRnzE5ISIiIovC5ISIiIgsCpMTIiIisihMToiIiMiiMDkhIiIii8LkhIiIiCwKkxMiIiKyKExOiIiIyKIwOaFaBQYGIjAwUOww6iwpKQkymQzXr1+v974WLVoEmUxWa71JkyahU6dO9R5PYyKTybBo0SKxw6g3Uv+dMPV9JvXxU/1gctIIVfyxkMlkOHbsWKXnBUGAu7s7ZDIZnn/+eREiJCIiql4zsQOg+mNjY4Nt27Zh4MCBeuVHjhzBzZs3oVAoDDrOoUOH6iO8JumTTz5BWVmZ2GFIyqNHj9CsGf9UWaoJEyZg7NixBv89ITIEZ04asdDQUHz22WcoLS3VK9+2bRv69esHFxcXg45jbW0Na2vr+gixyWnevDn/iNeRjY0NkxORFRUVVfucXC6HjY2NQcuaRIZictKIjRs3Dvfu3UNKSoqurKSkBJ9//jlefPFFg49jyDkniYmJkMlk2Lhxo1750qVLIZPJcODAgVr7+frrrzFo0CC0bNkSrVu3RlhYGH766SeDYvzpp5/w7LPPwtbWFh06dMDbb79dbzMUx44dw9NPPw0bGxt06dIFa9euNbitoevrnTp1wvPPP4+0tDT0798ftra26NOnD9LS0gAAe/bsQZ8+fWBjY4N+/frh3LlzBvWfn5+P2bNnw93dHQqFAl27dsXy5csN+reqiOnYsWMYMGAAbGxs0LlzZ2zevNmgvnfs2IF+/fqhdevWUCqV6NOnD95///1a2xl6zsnt27cxdepUODs7w8bGBt7e3ti0aZNBsZk6thUrViAgIABt27aFra0t+vXrh88//9ygtvXhxx9/xODBg/XeDxXv0drODZk0aRJatWqFa9euITQ0FK1bt8ZLL71Ubf26nHOyb98+9O7dGzY2Nujduzf27t1bx5FRkyFQo5OYmCgAEL7//nshICBAmDBhgu65ffv2CVZWVsKtW7cEDw8PISwsrNbjDR48WBg8eHCt9Z5//nnBzs5OyM7OFgRBEH788UfB2tpamDp1aq1tN2/eLMhkMmHYsGHChx9+KCxfvlzo1KmTYG9vL2RlZdXYNjc3V3B0dBQcHByERYsWCe+9957QrVs3wcvLSwBQa/u6+PHHHwVbW1uhY8eOQmxsrBATEyM4Ozvr+qpNRESE4OHhUWs9Dw8PwdPTU3B1dRUWLVokrF69Wmjfvr3QqlUrYevWrULHjh2FZcuWCcuWLRPs7OyErl27ClqttsZjFhUVCV5eXkLbtm2FN998U0hISBAmTpwoyGQyYdasWQbH5OzsLLz55pvCRx99JPj6+goymUy4cOFCjW0PHTokABCee+45Yc2aNcKaNWuEyMhIYdSoUbX2C0BYuHBhjXUePnwo9OjRQ2jevLnw+uuvCx988IEwaNAgAYAQFxdXr2MTBEHo0KGD8OqrrwofffSRsGrVKmHAgAECAOGrr76qta2hvxOGunnzptCmTRuhbdu2wuLFi4UVK1YI3bt3F7y9vQ16P0RERAgKhULo0qWLEBERISQkJAibN2+utn7F35vajpucnCxYWVkJvXv3FlatWiX8z//8j2BnZyf06tXLrOOnxoHJSSP05+Tko48+Elq3bi08fPhQEARBGDVqlBAUFCQIgmD25CQ3N1do06aNMGTIEKG4uFjo27ev0LFjR6GgoKDGdg8ePBDs7e2F6dOn65Wr1WrBzs6uUvlfzZ49WwAgnDx5Uld2+/Ztwc7OzuzJSXh4uGBjYyPcuHFDV/bzzz8Lcrnc7MkJAOH48eO6suTkZAGAYGtrq9f/2rVrBQDCt99+W+MxY2JihJYtWwq//PKLXvm8efMEuVyuSypri+no0aO6stu3bwsKhUJ44403amw7a9YsQalUCqWlpTXWq4ohyUlcXJwAQNi6dauurKSkRPD39xdatWolaDSaGtubMjZBEHTvrz/33bt3b+HZZ5+tta25k5N//etfgkwmE86dO6cru3fvntCmTRuDkxMAwrx58wzqz9DkxMfHR3B1dRXy8/N1ZRVJK5MT+isu6zRyo0ePxqNHj/DVV1/hwYMH+Oqrr+q0pFMXLi4uWLNmDVJSUjBo0CBkZmZi48aNUCqVNbZLSUlBfn4+xo0bh7t37+o2uVwOPz8/fPvttzW2P3DgAP72t79hwIABujJHR8cap6KNodVqkZycjPDwcHTs2FFX3qNHD4SEhJi1LwDo2bMn/P39dft+fn4AgGeffVav/4ryX3/9tcbjffbZZxg0aBAcHBz0/p2Dg4Oh1Wpx9OhRg2IaNGiQbt/R0RGenp619m1vb4+ioiK9JUZzOnDgAFxcXDBu3DhdWfPmzfHaa6+hsLAQR44cqfUYxo4NAGxtbXU/379/HwUFBRg0aBDOnj1bx5GY7uDBg/D394ePj4+urE2bNnV+P8yYMcNsMeXm5iIzMxMRERGws7PTlQ8ZMgQ9e/Y0Wz/UePAss0bO0dERwcHB2LZtGx4+fAitVot//OMf9dbf2LFjsXXrVuzfvx8vv/wynnvuuVrbXLlyBUD5h25Vaktubty4ofuA/jNPT89a+3706BEKCgr0yqo7UfjOnTt49OgRunXrVmVfhpxXUxd/TkAA6P6ou7u7V1l+//79Go935coV/Pjjj3B0dKzy+du3b9c5JgBwcHCote9XX30Vu3btwvDhw9G+fXsMHToUo0ePxrBhw2rt0xA3btxAt27dYGWl//+tHj166J6vjbFjA4CvvvoKb7/9NjIzM1FcXKwrF+Mk0Rs3bugltRW6du1q8DGaNWuGDh06mDUmANW+d8RI4siyMTlpAl588UVMnz4darUaw4cPh729fb31de/ePZw+fRoA8PPPP6OsrKzSB8ZfVZyMuWXLlioTg/q8UmPnzp2YPHmyXpkgCPXWX13I5fI6ldcWd1lZGYYMGYK5c+dW+fxTTz1ldEy19e3k5ITMzEwkJyfj66+/xtdff43ExERMnDjR4JNW65uxY/vuu+/wf/7P/8Hf//53fPzxx3B1dUXz5s2RmJiIbdu21Ueo9U6hUNT6viWqT0xOmoAXXngB//znP3HixAns3LmzXvuaOXMmHjx4gNjYWERHRyMuLg5RUVE1tunSpQuA8g+w4ODgOvfp4eGhm335s8uXL9faNiQkxOClBkdHR9ja2hrdl9i6dOmCwsJCo/6NzcHa2hojRozAiBEjUFZWhldffRVr167F/Pnz6/S/+qp4eHjgxx9/rJQMX7p0Sfd8fdm9ezdsbGyQnJysd5l4YmJivfVZEw8PD1y9erVSeVVlDaXi31+q7x1qeEyNm4BWrVohPj4eixYtwogRI+qtn88//xw7d+7EsmXLMG/ePIwdOxZvvfUWfvnllxrbhYSEQKlUYunSpXjy5Eml5+/cuVNj+9DQUJw4cQKnTp3Sa/Ppp5/WGrOrqyuCg4P1turI5XKEhIRg3759yM7O1pVfvHgRycnJtfYlttGjRyMjI6PKWPPz8yvdD8ec7t27p7dvZWUFLy8vANBbBjFWaGgo1Gq1XvJdWlqKDz/8EK1atcLgwYNN7qM6crkcMpkMWq1WV3b9+nXs27ev3vqsSUhICDIyMpCZmakr+/333w16P9QXV1dX+Pj4YNOmTXrLqCkpKfj5559Fi4ssF2dOmoiIiIh6Pf7t27cxY8YMBAUFITIyEgDw0Ucf4dtvv8WkSZNw7NixaqeJlUol4uPjMWHCBPj6+mLs2LFwdHREdnY29u/fj2eeeQYfffRRtX3PnTsXW7ZswbBhwzBr1iy0bNkS69at0/1v2pwWL16MgwcPYtCgQXj11Vd1H4C9evUye1/mNmfOHHz55Zd4/vnnMWnSJPTr1w9FRUU4f/48Pv/8c1y/fh3t2rWrl76nTZuG33//Hc8++yw6dOiAGzdu4MMPP4SPj4/uvBBTvPzyy1i7di0mTZqEM2fOoFOnTvj888+Rnp6OuLg4tG7d2gyjqFpYWBhWrVqFYcOG4cUXX8Tt27exZs0adO3aVZTfiblz52Lr1q0YMmQI/vWvf6Fly5ZYv349OnbsiN9//120m6XFxsYiLCwMAwcOxJQpU/D777/r3juFhYWixESWizMnZBYzZsxAcXGx7kZPANC2bVusW7cOGRkZWLFiRY3tX3zxRaSmpqJ9+/Z47733MGvWLOzYsQM+Pj6Vzgn5K1dXV3z77bfw8vLCsmXLEBcXh4kTJ2LWrFlmG18FLy8vJCcnw9HREQsWLMDGjRuxePFivPDCC2bvy9xatGiBI0eOYM6cOUhLS8OsWbOwbNkyXLlyBYsXL9a7isLcxo8fDxsbG3z88cd49dVXsWnTJowZMwZff/21Wc5tsLW1RVpaGl566SVs2rQJb7zxBn7//XckJibWy+/Bnz377LPYsGED1Go1Zs+eje3bt2P58uWi/U64u7vj22+/RY8ePbB06VLExcUhIiICU6ZMAVB+x10xDBs2DJ999hm0Wi2io6OxZ88eJCYmon///qLEQ5ZNJljK2X9ERFRvZs+ejbVr16KwsLDak3+JLAVnToiIGplHjx7p7d+7dw9btmzBwIEDmZiQJPCcEyKiRsbf3x+BgYHo0aMH8vLysGHDBmg0GsyfP1/s0IgMwuSEiKiRCQ0Nxeeff45169ZBJpPB19cXGzZswN///nexQyMyiKjLOrGxsXj66afRunVrODk5ITw83KBr3j/77DN0794dNjY26NOnT6U7cwqCgAULFsDV1RW2trYIDg6u8vp6IqLGaOnSpfjll1/w8OFDFBUV4bvvvhPt/jZExhA1OTly5AhmzpyJEydOICUlBU+ePMHQoUNRVFRUbZvjx49j3LhxmDp1Ks6dO4fw8HCEh4fjwoULujrvvvsuPvjgAyQkJODkyZNo2bIlQkJC8Pjx44YYFhEREZnAoq7WuXPnDpycnHDkyJFqpx/HjBmDoqIifPXVV7qyv/3tb/Dx8UFCQgIEQYCbmxveeOMN/Pvf/wYAFBQUwNnZGUlJSRg7dmyDjIWIiIiMY1HnnFTcObBNmzbV1snIyKh0O/SKu3YCQFZWFtRqtd4Upp2dHfz8/JCRkVFlclJcXKx3l8qysjL8/vvvaNu2rWg3LCIiImkQBAEPHjyAm5tbvX4n0ePHj1FSUmLycaytrUW7342hLCY5KSsrw+zZs/HMM8+gd+/e1dZTq9VwdnbWK3N2doZardY9X1FWXZ2/io2NxeLFi00Jn4iImricnByzfpvznz1+/BiOtrYwx710XVxckJWVZdEJisUkJzNnzsSFCxdw7NixBu87OjpabzamoKAAHTt2xPtjAZ/K36IuGYd+At7ZD6xbCHh2Ejsa4xzKAN5ZB8xb1wEenoraG1iok4ceIOmd23h23f+DvWf93CK+vmUfuoLT73wD649WwapbF7HDMVrpN0dQunwVMGwd0NZT7HCM9+shIOMdAOsASHUchwC8A2AEgLYix2IKNYCD9fo1CSUlJSgE8DoAU/4SFgNYrVajpKSEyUltIiMj8dVXX+Ho0aO1Zp0uLi7Iy8vTK8vLy4OLi4vu+YoyV1dXvTo+Pj5VHlOhUOh9m2gFn47A32v/FnmLlfN7+WO/noBvT3FjMVbOH5Nd3fu1gKdvC3GDMUFeTvkXGjr2aw8n3/r5n1V9e5BTvuwq9/GCvK+3yNEYT7j5G0oBwLUf4OIrdjjG0+T88UM/AFIdR8UYXAG4iRmIWTTEaQAtAZiSUljEh74BRL1aRxAEREZGYu/evfjmm2+gUqlqbePv74/U1FS9spSUFPj7+wMAVCoVXFxc9OpoNBqcPHlSV4eIiEiKmpthkwJRk6iZM2di27Zt+OKLL9C6dWvdOSF2dnawtbUFAEycOBHt27dHbGwsAGDWrFkYPHgwVq5cibCwMOzYsQOnT5/GunXrAJRnrrNnz8bbb7+Nbt26QaVSYf78+XBzc0N4eLgo4yQiIjKHZjDtg1sqMyeixhkfHw8ACAwM1CtPTEzEpEmTAADZ2dl6Zz8HBARg27ZteOutt/Dmm2+iW7du2Ldvn95JtHPnzkVRURFefvll5OfnY+DAgTh48KBFr68RERFROVGTE0NusZKWllapbNSoURg1alS1bWQyGZYsWYIlS5aYEh4REZFFaQbTlmZKzRVIPZPKDA8REVGT11SWdUQ9IZaIiIjor6SSRBERETV5pl5xw2UdIiIiMisu6xARERGJQCpJFBERUZNn6tU6T8wVSD1jckJERCQRXNYhIiIiEoFUkigiIqImz9SrdfjdOkRERGRWTE6IiIjIovCcEyIiIiIRSCWJIiIiavJMvZRYKh/6nDkhIiKSiGZm2OrqwYMHmD17Njw8PGBra4uAgAB8//33NbZJS0uDr68vFAoFunbtiqSkpDr1yeSEiIiIqjVt2jSkpKRgy5YtOH/+PIYOHYrg4GDcunWryvpZWVkICwtDUFAQMjMzMXv2bEybNg3JyckG98nkhIiISCKam2Gri0ePHmH37t1499138fe//x1du3bFokWL0LVrV8THx1fZJiEhASqVCitXrkSPHj0QGRmJf/zjH1i9erXB/TI5ISIikoiGXtYpLS2FVquFjY2NXrmtrS2OHTtWZZuMjAwEBwfrlYWEhCAjI8PgfpmcEBERNTEajUZvKy4urrJe69at4e/vj5iYGPz222/QarXYunUrMjIykJubW2UbtVoNZ2dnvTJnZ2doNBo8evTIoPiYnBAREUlExdU6xm4VMyfu7u6ws7PTbbGxsdX2uWXLFgiCgPbt20OhUOCDDz7AuHHjYGVVfymEVK4qIiIiavLMdRO2nJwcKJVKXblCoai2TZcuXXDkyBEUFRVBo9HA1dUVY8aMQefOnaus7+Ligry8PL2yvLw8KJVK2Nra1ilOIiIiaiKUSqVecmKIli1bomXLlrh//z6Sk5Px7rvvVlnP398fBw4c0CtLSUmBv7+/wX1xWYeIiEgiGvpqHQBITk7GwYMHkZWVhZSUFAQFBaF79+6YPHkyACA6OhoTJ07U1X/llVfw66+/Yu7cubh06RI+/vhj7Nq1C6+//rrBfTI5ISIikggxbsJWUFCAmTNnonv37pg4cSIGDhyI5ORkNG9enurk5uYiOztbV1+lUmH//v1ISUmBt7c3Vq5cifXr1yMkJKRO4yQiIiIJEOP29aNHj8bo0aOrfb6qu78GBgbi3LlzRvRWjjMnREREZFE4c0JERCQRxp438uf2UsDkhIiISCLMdSmxpeOyDhEREVkUqSRRRERETV4zOdBcZkJ7AYDWbOHUGyYnREREEtGsGdCsCSQnXNYhIiIii8KZEyIiIolobuKyTnPBfLHUJyYnREREEmGWZR0J4LIOERERWRTOnBAREUlEcznQ3IRpheZl5oulPok6c3L06FGMGDECbm5ukMlk2LdvX431J02aBJlMVmnr1auXrs6iRYsqPd+9e/d6HgkREVEDkJthkwBRk5OioiJ4e3tjzZo1BtV///33kZubq9tycnLQpk0bjBo1Sq9er1699OodO3asPsInIiJqWGJ8LbEIRA1z+PDhGD58uMH17ezsYGdnp9vft28f7t+/j8mTJ+vVa9asGVxcXMwWJxERETUcieRQVduwYQOCg4Ph4eGhV37lyhW4ubnBxsYG/v7+iI2NRceOHas9TnFxMYqLi3X7Go0GAHBZDbRS1E/sDSHrbvnjxV/FjcMUWbfKH69ffCxuICb6LasEAHD/4m2RIzHeg6zfAQBll6+IHIlpym5kl/9w96K4gZgqP+uPH6Q8joox3BU1CtPda7iumsG0NQ+JnHMiEwTBIi4skslk2Lt3L8LDww2q/9tvv6Fjx47Ytm0bRo8erSv/+uuvUVhYCE9PT+Tm5mLx4sW4desWLly4gNatW1d5rEWLFmHx4sXmGAYRETVRBQUFUCqV9XJsjUYDOzs7FHQClCYkJ5oywO56/cZqDpKdOdm0aRPs7e0rJTN/Xiby8vKCn58fPDw8sGvXLkydOrXKY0VHRyMqKkq3r9Fo4O7ujv/xBXrY10f0DSNdDcT/DMRMBFTOYkdjnPSfgfj9wL9iHNBeJZUv+67sXPoj7Ix/gGdinoNS5SB2OEb5Lf0Gfoj/HopF/4FVJ3exwzFa6fHv8WTdJiAwBrBXiR2O8XLSgTPxAGIASHUc6QDiAQQBkOb7otwdAN+JHUSjIsnkRBAEbNy4ERMmTIC1tXWNde3t7fHUU0/h6tWr1dZRKBRQKCqv3wztAPzdzeRwRRX/MxDaH/DtKnYkxovfDwwKbYmevhJeYwOwM/4BVKFPwdlXur9UP8R/j+bDnoW8r5fYoZjkybpNQNdQwNVX7FBMcyYeQCgAKY8jHkA3ANJ9XwDX0WDJiRUkc8WNKSR5E7YjR47g6tWr1c6E/FlhYSGuXbsGV1fXBoiMiIioHjWRq3VETU4KCwuRmZmJzMxMAEBWVhYyMzORnV1+wlp0dDQmTpxYqd2GDRvg5+eH3r17V3ru3//+N44cOYLr16/j+PHjeOGFFyCXyzFu3Lh6HQsRERGZh6g51OnTpxEUFKTbrzjvIyIiAklJScjNzdUlKhUKCgqwe/duvP/++1Ue8+bNmxg3bhzu3bsHR0dHDBw4ECdOnICjo2P9DYSIiKghNINpyzomfC9PQxI1OQkMDERNFwslJSVVKrOzs8PDhw+rbbNjxw5zhEZERGR5JHSXV1NI8pwTIiIiarwkcmoMERERcVmHiIiILIscTeKTuwkMkYiIqJEw9ZwTi7gnfO14zgkRERFZFM6cEBERSYWEbqRmiiYwRCIiokaiiSQnXNYhIiIii9IE8i8iIqJGoonMnDSBIRIRETUSpn4rcZm5AqlfXNYhIiIii8KZEyIiIqkwdVlHIvc5YXJCREQkFU0kOeGyDhEREVVJq9Vi/vz5UKlUsLW1RZcuXRATEwNBqD7LSUtLg0wmq7Sp1WqD++XMCRERkVSYevv6Op4Qu3z5csTHx2PTpk3o1asXTp8+jcmTJ8POzg6vvfZajW0vX74MpVKp23dycjK4XyYnREREUtHAyzrHjx/HyJEjERYWBgDo1KkTtm/fjlOnTtXa1snJCfb29kYEyWUdIiIi6aj4VmJjtzrOugQEBCA1NRW//PILAOCHH37AsWPHMHz48Frb+vj4wNXVFUOGDEF6enqd+uXMCRERUROj0Wj09hUKBRQKRaV68+bNg0ajQffu3SGXy6HVavHOO+/gpZdeqvbYrq6uSEhIQP/+/VFcXIz169cjMDAQJ0+ehK+vr0HxMTkhIiKSClPPOfmjrbu7u17xwoULsWjRokrVd+3ahU8//RTbtm1Dr169kJmZidmzZ8PNzQ0RERFVduHp6QlPT0/dfkBAAK5du4bVq1djy5YtBoXJ5ISIiEgqTD3n5I8TYnNycvROVq1q1gQA5syZg3nz5mHs2LEAgD59+uDGjRuIjY2tNjmpyoABA3Ds2DGD6zM5ISIiamKUSqVeclKdhw8fwspK//RUuVyOsrK6XfaTmZkJV1dXg+szOSEiIpIKM82cGGrEiBF455130LFjR/Tq1Qvnzp3DqlWrMGXKFF2d6Oho3Lp1C5s3bwYAxMXFQaVSoVevXnj8+DHWr1+Pb775BocOHTK4XyYnREREUtHAycmHH36I+fPn49VXX8Xt27fh5uaGf/7zn1iwYIGuTm5uLrKzs3X7JSUleOONN3Dr1i20aNECXl5eOHz4MIKCggzul8kJERERVal169aIi4tDXFxctXWSkpL09ufOnYu5c+ea1C+TEyIiIqmwgmlX60jk7mZMToiIiKTC1GUdrbkCqV8SyaGIiIioqeDMCRERkVQ0kZkTJidERERSYaY7xFo6JidERERS0URmTnjOCREREVkUzpwQERFJhRymfXKXmiuQ+sXkhIiISCpMXdaRyKc+l3WIiIjIokgkhyIiIqKmcrWOqDMnR48exYgRI+Dm5gaZTIZ9+/bVWD8tLQ0ymazSplar9eqtWbMGnTp1go2NDfz8/HDq1Kl6HAUREVEDaWaGTQJETU6Kiorg7e2NNWvW1Knd5cuXkZubq9ucnJx0z+3cuRNRUVFYuHAhzp49C29vb4SEhOD27dvmDp+IiIjqgag51PDhwzF8+PA6t3NycoK9vX2Vz61atQrTp0/H5MmTAQAJCQnYv38/Nm7ciHnz5pkSLhERkbh4Qqzl8vHxgaurK4YMGYL09HRdeUlJCc6cOYPg4GBdmZWVFYKDg5GRkSFGqEREROZT8a3Exm4S+dSXSA5VztXVFQkJCejfvz+Ki4uxfv16BAYG4uTJk/D19cXdu3eh1Wrh7Oys187Z2RmXLl2q9rjFxcUoLi7W7Ws0GgDA5XygVfN6GUqDyHpQ/ngxR9w4TJGVV/7468UScQMx0a2sJwCA3y/eETkS42my7gMAtJeuiByJacqu//GGuHtR3EBMlZ/1xw9SHkfFGO6KGoXp7okdQKMjqeTE09MTnp6euv2AgABcu3YNq1evxpYtW4w+bmxsLBYvXlyp/OWjRh/Soox/T+wITDdvfOM4Z+jA+M/FDsFkjyZFih2CeewbL3YEZtIYxrFH7ACko4ks60gkzOoNGDAAx44dAwC0a9cOcrkceXl5enXy8vLg4uJS7TGio6MRFRWl29doNHB3d8d4AB71EnXDOA/gSwAxQYDKXuRgjJSeA8SfBqJjmqOjSiLzkVU4la5FYnwpgmIGwUFlJ3Y4RslOv4XT8efQMuYNWKncxQ7HaE/ST+Nx/Fbg2RjAXiV2OMbLSQe+jwcQA0Cq40gHEA8gCICDyLGY4g6A7xqmKyYn0pCZmQlXV1cAgLW1Nfr164fU1FSEh4cDAMrKypCamorIyOr/t6dQKKBQKCqV9wfgXR9BN6AvAYR2BXxdxY7EePGngedCm8HbVyIX6FcjMb4U3UI7w823+kTZ0p2OPwfr0CA09+0jdigmeRy/FegWCrj5ih2Kab6PBxAKyCQ6DgEoT066AXATNxaTXEeDJSdN5D4noiYnhYWFuHr1qm4/KysLmZmZaNOmDTp27Ijo6GjcunULmzdvBgDExcVBpVKhV69eePz4MdavX49vvvkGhw4d0h0jKioKERER6N+/PwYMGIC4uDgUFRXprt4hIiIiyyZqcnL69GkEBQXp9iuWViIiIpCUlITc3FxkZ2frni8pKcEbb7yBW7duoUWLFvDy8sLhw4f1jjFmzBjcuXMHCxYsgFqtho+PDw4ePFjpJFkiIiLJ4bJO/QsMDIQgCNU+n5SUpLc/d+5czJ07t9bjRkZG1riMQ0REJEmmfiuxRJZ1pHuGIRERETVKEpngISIiIi7rEBERkWVpIlfrcFmHiIiILApnToiIiKSCyzpERERkUZpIcsJlHSIiIrIoEsmhiIiICFYw7aRWiUxJMDkhIiKSiiayrCORMImIiKipJCcSmeAhIiKipkIiORQRERE1lZuwMTkhIiKSCi7rEBERUVOm1Woxf/58qFQq2NraokuXLoiJiYEgCDW2S0tLg6+vLxQKBbp27YqkpKQ69SuRHIqIiIggh2mf3HVc1lm+fDni4+OxadMm9OrVC6dPn8bkyZNhZ2eH1157rco2WVlZCAsLwyuvvIJPP/0UqampmDZtGlxdXRESEmJQv0xOiIiIpKKBl3WOHz+OkSNHIiwsDADQqVMnbN++HadOnaq2TUJCAlQqFVauXAkA6NGjB44dO4bVq1cbnJxwWYeIiIiqFBAQgNTUVPzyyy8AgB9++AHHjh3D8OHDq22TkZGB4OBgvbKQkBBkZGQY3C9nToiIiKTCTFfraDQavWKFQgGFQlGp+rx586DRaNC9e3fI5XJotVq88847eOmll6rtQq1Ww9nZWa/M2dkZGo0Gjx49gq2tba1hcuaEiIhIKpqZYQPg7u4OOzs73RYbG1tld7t27cKnn36Kbdu24ezZs9i0aRNWrFiBTZs21eMgOXNCRETU5OTk5ECpVOr2q5o1AYA5c+Zg3rx5GDt2LACgT58+uHHjBmJjYxEREVFlGxcXF+Tl5emV5eXlQalUGjRrAjA5ISIikg4zXa2jVCr1kpPqPHz4EFZW+osscrkcZWVl1bbx9/fHgQMH9MpSUlLg7+9vcJhc1iEiIpIKuRm2OhgxYgTeeecd7N+/H9evX8fevXuxatUqvPDCC7o60dHRmDhxom7/lVdewa+//oq5c+fi0qVL+Pjjj7Fr1y68/vrrBvfLmRMiIiKpaOBLiT/88EPMnz8fr776Km7fvg03Nzf885//xIIFC3R1cnNzkZ2drdtXqVTYv38/Xn/9dbz//vvo0KED1q9fb/BlxEaESURERE1F69atERcXh7i4uGrrVHX318DAQJw7d87ofpmcEBERSUUT+W4diYRJRERETSU54QmxREREZFEkkkMRERGRYAUIJtwhVpDIlASTEyIiIonQNivfTGkvBRLJoYiIiKipkEgORURERE1l5kQiYRIREVGpXIZSucyE9gIAwXwB1RMu6xAREZFF4cwJERGRRGibNYO2mfEzJ9pmAoAn5guonjA5ISIikgitXA6tCcs6Wrk0khNRl3WOHj2KESNGwM3NDTKZDPv27aux/p49ezBkyBA4OjpCqVTC398fycnJenUWLVoEmUymt3Xv3r0eR0FERNQwyiCH1oStrK5fSywSUZOToqIieHt7Y82aNQbVP3r0KIYMGYIDBw7gzJkzCAoKwogRIyp9uVCvXr2Qm5ur244dO1Yf4RMREVE9EHVZZ/jw4Rg+fLjB9f/6rYhLly7FF198gf/93/9F3759deXNmjWDi4uLucIkIiKyCKWQoxQmXK0jgSt1AIlfrVNWVoYHDx6gTZs2euVXrlyBm5sbOnfujJdeegnZ2dkiRUhERGQ+5cszzUzYpLGsI+kTYlesWIHCwkKMHj1aV+bn54ekpCR4enoiNzcXixcvxqBBg3DhwgW0bt26yuMUFxejuLhYt6/RaAAAOQBs63UE9Sv3j8eLd0UNwyRZ+eWPVy6WiRqHqbKzyuO/e/GeyJEY735WAQBAe/GqyJGYpiwrp/yHuxfFDcRU+Vl//HBRCretqEbFGCT8RwoAIN33taWSCYJgEb/WMpkMe/fuRXh4uEH1t23bhunTp+OLL75AcHBwtfXy8/Ph4eGBVatWYerUqVXWWbRoERYvXmxM2ERERACAgoICKJXKejm2RqOBnZ0dLhS0Q2ul8YseDzRl6G13t15jNQdJzpzs2LED06ZNw2effVZjYgIA9vb2eOqpp3D1avX/24uOjkZUVJRuX6PRwN3dHYMAOJoraBFkAzgNIMYbULUSOxrjpN8G4q8Ai98COnmIHY3xjp8A1m4AhsT4w0FlJ3Y4RrmRfgsn48+jVUwUmqncxQ7HaMXpp/Eo/lPg2RjAXiV2OMbLSQe+jwcQA0Cq40gHEA8gCICDyLGY4g6A7xqkp/JlHeOTE60J56s0JMklJ9u3b8eUKVOwY8cOhIWF1Vq/sLAQ165dw4QJE6qto1AooFAoKpV3AdDJhFgtwWkAoe0B37ZiR2K8+CvAsCGAr4/YkZhm7QbAM1SF9r5OYoditJPx52ETGojmvr3FDsUkj+I/BbqFAm6+Yodimu/jAYQCMomOQwDKk5NuANzEjcUk19FQyUlTIWpyUlhYqDejkZWVhczMTLRp0wYdO3ZEdHQ0bt26hc2bNwMoX8qJiIjA+++/Dz8/P6jVagCAra0t7OzK/zf673//GyNGjICHhwd+++03LFy4EHK5HOPGjWv4ARIREZlRU5k5EfVqndOnT6Nv3766y4CjoqLQt29fLFiwAACQm5urd6XNunXrUFpaipkzZ8LV1VW3zZo1S1fn5s2bGDduHDw9PTF69Gi0bdsWJ06cgKOjlBdoiIiIypOTUhM2Xq1jgMDAQNR0Pm5SUpLeflpaWq3H3LFjh4lRERERWabyy4FNmTmRxpWPkr7PCRERETU+kjshloiIqKnSwsqkpRmtGWOpT0xOiIiIJEJr4nkjUklOuKxDREREFoUzJ0RERBJRcdWN8e2lgckJERGRRJSZ+OV9ZbzPCREREVHdceaEiIhIIprKCbFMToiIiCSiqSQnXNYhIiIii8KZEyIiIokw/SZs1X9ljCVhckJERCQRpl9KzOSEiIiIzKj8i/+M/+jmOSdEREQkaZ06dYJMJqu0zZw5s8r6SUlJlera2NjUuV/OnBAREUlEmYlX65TVcVnn+++/h1b73/mWCxcuYMiQIRg1alS1bZRKJS5fvqzbl8nqfuM3JidEREQSYfqlxHVLThwdHfX2ly1bhi5dumDw4MHVtpHJZHBxcTEqvgpc1iEiIqJalZSUYOvWrZgyZUqNsyGFhYXw8PCAu7s7Ro4ciZ9++qnOfXHmhIiISCJKYWXi1TplAACNRqNXrlAooFAoamy7b98+5OfnY9KkSdXW8fT0xMaNG+Hl5YWCggKsWLECAQEB+Omnn9ChQweD4+TMCRERkURUXK1jygYA7u7usLOz022xsbG19r1hwwYMHz4cbm5u1dbx9/fHxIkT4ePjg8GDB2PPnj1wdHTE2rVr6zROzpwQERE1MTk5OVAqlbr92mZNbty4gcOHD2PPnj116qd58+bo27cvrl69Wqd2TE6IiIgkwvQTYsuXdZRKpV5yUpvExEQ4OTkhLCysbv1ptTh//jxCQ0Pr1I7JCRERkUSYKzmpi7KyMiQmJiIiIgLNmumnDRMnTkT79u11y0JLlizB3/72N3Tt2hX5+fl47733cOPGDUybNq1OfTI5ISIiomodPnwY2dnZmDJlSqXnsrOzYWX139NX79+/j+nTp0OtVsPBwQH9+vXD8ePH0bNnzzr1yeSEiIhIIrQmfreOMTMnQ4cOhSBUfX+UtLQ0vf3Vq1dj9erVxoSmh8kJERGRRJj+3Tr84j8iIiIyIy2sTDznRBpf/cf7nBAREZFF4cwJERGRRJh+tY7xbRsSkxMiIiKJaCrJCZd1iIiIyKJw5oSIiEgiTL+UWBozJ0xOiIiIJML0S4nrfp8TMXBZh4iIiCwKZ06IiIgkoqmcEMvkhIiISCJMvwmbNBZMpBElERERNRmiJidHjx7FiBEj4ObmBplMhn379tXaJi0tDb6+vlAoFOjatSuSkpIq1VmzZg06deoEGxsb+Pn54dSpU+YPnoiIqIGV/nG1jimbFNQ5OYmIiMDRo0fN0nlRURG8vb2xZs0ag+pnZWUhLCwMQUFByMzMxOzZszFt2jQkJyfr6uzcuRNRUVFYuHAhzp49C29vb4SEhOD27dtmiZmIiEgsFVfrmLJJQZ2jLCgoQHBwMDw8PDB58mRERESgffv2RnU+fPhwDB8+3OD6CQkJUKlUWLlyJQCgR48eOHbsGFavXo2QkBAAwKpVqzB9+nRMnjxZ12b//v3YuHEj5s2bZ1ScRERElqDMxBNiyyQyc1Ln5GTfvn24c+cOtmzZgk2bNmHhwoUIDg7G1KlTMXLkSDRv3rw+4gQAZGRkIDg4WK8sJCQEs2fPBgCUlJTgzJkziI6O1j1vZWWF4OBgZGRkVHvc4uJiFBcX6/Y1Gg0A4B4Aa/OF3+Du//F4sUDUMEySVVj+eOkXceMw1fUb5Y+3L/4ubiAmuJ9V/otUevGqyJGYpjQrp/yHuxfFDcRU+Vl//HAREESNxAQVY7grahSmuyd2AI2OUfM7jo6OiIqKQlRUFM6ePYvExERMmDABrVq1wvjx4/Hqq6+iW7du5o4VarUazs7OemXOzs7QaDR49OgR7t+/D61WW2WdS5cuVXvc2NhYLF68uFL5/5onbNGNTxc7AtNFTBc7AvPYNf6g2CGYLH98lNghmMfu8WJHYCaNYRx7xA5AMngpsQFyc3ORkpKClJQUyOVyhIaG4vz58+jZsyfeffddvP766+aKs15FR0cjKuq/f3A1Gg3c3d0xCICjeGGZLBvAaQAx3oCqldjRGCf9NhB/BVj8FtDJQ+xojHf8BLB2AzAkxh8OKjuxwzHKjfRbOBl/Hq1iotBM5S52OEYrTj+NR/GfAs/GAPYqscMxXk468H08gBgAUh1HOoB4AEEAHESOxRR3AHzXID01lUuJ65ycPHnyBF9++SUSExNx6NAheHl5Yfbs2XjxxRehVCoBAHv37sWUKVPMnpy4uLggLy9PrywvLw9KpRK2traQy+WQy+VV1nFxcan2uAqFAgqFolJ5FwCdzBG4iE4DCG0P+LYVOxLjxV8Bhg0BfH3EjsQ0azcAnqEqtPd1EjsUo52MPw+b0EA09+0tdigmeRT/KdAtFHDzFTsU03wfDyAUkEl0HAJQnpx0A+AmbiwmuY6GSk6aijonJ66urigrK8O4ceNw6tQp+Pj4VKoTFBQEe3t7M4Snz9/fHwcOHNArS0lJgb+/PwDA2toa/fr1Q2pqKsLDwwEAZWVlSE1NRWRkpNnjISIiakilkENuwsyJVC4lrnNysnr1aowaNQo2NjbV1rG3t0dWVla1z1coLCzE1av/PbkuKysLmZmZaNOmDTp27Ijo6GjcunULmzdvBgC88sor+OijjzB37lxMmTIF33zzDXbt2oX9+/frjhEVFYWIiAj0798fAwYMQFxcHIqKinRX7xAREUmV6V/810gvJZ4wYYLZOj99+jSCgoJ0+xXnfURERCApKQm5ubnIzs7WPa9SqbB//368/vrreP/999GhQwesX79edxkxAIwZMwZ37tzBggULoFar4ePjg4MHD1Y6SZaIiIgsk6gpVGBgIASh+mvgqrr7a2BgIM6dO1fjcSMjI7mMQ0REjQ7vc0JEREQWpalcSiyNa4qIiIioyeDMCRERkUSUQg4rXq1DRERElqJ8WceUq3WYnBAREZEZ8ZwTIiIiIhFw5oSIiEgimsrMCZMTIiIiiWgq9znhsg4RERFZFM6cEBERSUQp5JDxUmIiIiKyFFrIYdUELiXmsg4RERFZFCYnREREElFxtY4pW1106tQJMpms0jZz5sxq23z22Wfo3r07bGxs0KdPHxw4cKDO42RyQkREJBENnZx8//33yM3N1W0pKSkAgFGjRlVZ//jx4xg3bhymTp2Kc+fOITw8HOHh4bhw4UKd+mVyQkRERFVydHSEi4uLbvvqq6/QpUsXDB48uMr677//PoYNG4Y5c+agR48eiImJga+vLz766KM69cvkhIiISCJKITd5M1ZJSQm2bt2KKVOmQCaTVVknIyMDwcHBemUhISHIyMioU1+8WoeIiEgiytDMpC/+K/ujrUaj0StXKBRQKBQ1tt23bx/y8/MxadKkauuo1Wo4OzvrlTk7O0OtVtcpTs6cEBERSYS5zjlxd3eHnZ2dbouNja217w0bNmD48OFwc3Or72Fy5oSIiKipycnJgVKp1O3XNmty48YNHD58GHv27KmxnouLC/Ly8vTK8vLy4OLiUqf4OHNCREQkEVpYmThzUv6xr1Qq9bbakpPExEQ4OTkhLCysxnr+/v5ITU3VK0tJSYG/v3+dxsmZEyIiIokoP6G1YW9fX1ZWhsTERERERKBZM/20YeLEiWjfvr1uWWjWrFkYPHgwVq5cibCwMOzYsQOnT5/GunXr6tQnZ06IiIioWocPH0Z2djamTJlS6bns7Gzk5ubq9gMCArBt2zasW7cO3t7e+Pzzz7Fv3z707t27Tn1y5oSIiEgitGgGmUnfrVP3tkOHDoUgCFU+l5aWVqls1KhR1d6kzVBMToiIiCSizIi7vP61vRRwWYeIiIgsCmdOiIiIJEJr4gmxpsy6NCQmJ0RERBLRVJITLusQERGRReHMCRERkUSUwgqCSTMn0piTYHJCREQkEeWXAjfspcRikEaURERExHNOiIiIiMTAmRMiIiKJKDNx5kQqN2FjckJERCQRpZDDqgkkJ1zWISIiIotiEcnJmjVr0KlTJ9jY2MDPzw+nTp2qtm5gYCBkMlmlLSwsTFdn0qRJlZ4fNmxYQwyFiIio3mghhxbNTNikMXMi+rLOzp07ERUVhYSEBPj5+SEuLg4hISG4fPkynJycKtXfs2cPSkpKdPv37t2Dt7d3pW9AHDZsGBITE3X7CoWi/gZBRETUALSQm3SfEy7rGGjVqlWYPn06Jk+ejJ49eyIhIQEtWrTAxo0bq6zfpk0buLi46LaUlBS0aNGiUnKiUCj06jk4ODTEcIiIiMhEos6clJSU4MyZM4iOjtaVWVlZITg4GBkZGQYdY8OGDRg7dixatmypV56WlgYnJyc4ODjg2Wefxdtvv422bdtWeYzi4mIUFxfr9jUaDQDgHgDrOo7Jktz/4/FigahhmCSrsPzx0i/ixmGq6zfKH29f/F3cQExwP6v8F6n04lWRIzFNaVZO+Q93L4obiKnys/744SIgiBqJCSrGcFfUKEx3r8F6aiozJzJBEET7tf7tt9/Qvn17HD9+HP7+/rryuXPn4siRIzh58mSN7U+dOgU/Pz+cPHkSAwYM0JXv2LEDLVq0gEqlwrVr1/Dmm2+iVatWyMjIgFxe+YVZtGgRFi9ebL6BERFRk1NQUAClUlkvx9ZoNLCzs4PD/YuwUrY2+jhlmge479CjXmM1B9HPOTHFhg0b0KdPH73EBADGjh2r+7lPnz7w8vJCly5dkJaWhueee67ScaKjoxEVFaXb12g0cHd3x3gAHvUWff07D+BLADFBgMpe5GCMlJ4DxJ8GomOao6NK9FVIo51K1yIxvhRBMYPgoLITOxyjZKffwun4c2gZ8wasVO5ih2O0J+mn8Th+K/BsDGCvEjsc4+WkA9/HA4gBINVxpAOIBxAEQMpL73cAfCd2EI2KqMlJu3btIJfLkZeXp1eel5cHFxeXGtsWFRVhx44dWLJkSa39dO7cGe3atcPVq1erTE4UCkWVJ8z2B+Bd69Et25cAQrsCvq5iR2K8+NPAc6HN4O0rjenI6iTGl6JbaGe4+db8u23JTsefg3VoEJr79hE7FJM8jt8KdAsF3HzFDsU038cDCAVkEh2HAJQnJ90AuIkbi0muo6GSE22pHGWlxv8tFExo25BE/a+otbU1+vXrh9TUVF1ZWVkZUlNT9ZZ5qvLZZ5+huLgY48ePr7Wfmzdv4t69e3B1lfAnNBERNXna0mYmb1IgepRRUVGIiIhA//79MWDAAMTFxaGoqAiTJ08GAEycOBHt27dHbGysXrsNGzYgPDy80kmuhYWFWLx4Mf7f//t/cHFxwbVr1zB37lx07doVISEhDTYuIiIic9OWWkFm0syJNJbHRU9OxowZgzt37mDBggVQq9Xw8fHBwYMH4ezsDADIzs6GlZX+P+bly5dx7NgxHDp0qNLx5HI5fvzxR2zatAn5+flwc3PD0KFDERMTw3udEBERSYDoyQkAREZGIjIyssrn0tLSKpV5enqiuouMbG1tkZycbM7wiIiILIK2VG7izIk0zjmxiOSEiIiIaldaKofsSeNPTqSx+ERERERNBmdOiIiIJELQNoOgNeGj25S2DUgaURIRERFQKi/fTGkvAVzWISIiIovCmRMiIiKpaCIzJ0xOiIiIpEIrA0plprWXAC7rEBERkUXhzAkREZFUlP6xmdJeApicEBERSQWTEyIiIrIoTSQ54TknREREZFGYnBAREUlFKYAnJmxGzJzcunUL48ePR9u2bWFra4s+ffrg9OnT1dZPS0uDTCartKnVaoP75LIOERGRVGj/2ExpXwf379/HM888g6CgIHz99ddwdHTElStX4ODgUGvby5cvQ6lU6vadnJwM7pfJCREREVVp+fLlcHd3R2Jioq5MpVIZ1NbJyQn29vZG9ctlHSIiIqkoNcNWB19++SX69++PUaNGwcnJCX379sUnn3xiUFsfHx+4urpiyJAhSE9Pr1O/TE6IiIikwkzJiUaj0duKi4ur7O7XX39FfHw8unXrhuTkZMyYMQOvvfYaNm3aVG2Irq6uSEhIwO7du7F79264u7sjMDAQZ8+eNXiYXNYhIiJqYtzd3fX2Fy5ciEWLFlWqV1ZWhv79+2Pp0qUAgL59++LChQtISEhARERElcf29PSEp6enbj8gIADXrl3D6tWrsWXLFoPiY3JCREQkFWa6z0lOTo7eyaoKhaLK6q6urujZs6deWY8ePbB79+46dTtgwAAcO3bM4PpMToiIiKRCC9OSkz+u1lEqlXrJSXWeeeYZXL58Wa/sl19+gYeHR526zczMhKurq8H1mZwQERFRlV5//XUEBARg6dKlGD16NE6dOoV169Zh3bp1ujrR0dG4desWNm/eDACIi4uDSqVCr1698PjxY6xfvx7ffPMNDh06ZHC/TE6IiIikooFvX//0009j7969iI6OxpIlS6BSqRAXF4eXXnpJVyc3NxfZ2dm6/ZKSErzxxhu4desWWrRoAS8vLxw+fBhBQUEG98vkhIiISCpE+G6d559/Hs8//3y1zyclJentz507F3Pnzq17R3/C5ISIiEgqKm5Db0p7CeB9ToiIiMiicOaEiIhIKhr4u3XEwuSEiIhIKsx0KbGl47IOERERWRTOnBAREUmFCFfriIHJCRERkVQ0keSEyzpERERkUThzQkREJBVNZOaEyQkREZFU8GodIiIioobHmRMiIiKpaCLLOhYxc7JmzRp06tQJNjY28PPzw6lTp6qtm5SUBJlMprfZ2Njo1REEAQsWLICrqytsbW0RHByMK1eu1PcwiIiI6tcTM2wSIHpysnPnTkRFRWHhwoU4e/YsvL29ERISgtu3b1fbRqlUIjc3V7fduHFD7/l3330XH3zwARISEnDy5Em0bNkSISEhePz4cX0Ph4iIqP5ozbBJgOjJyapVqzB9+nRMnjwZPXv2REJCAlq0aIGNGzdW20Ymk8HFxUW3OTs7654TBAFxcXF46623MHLkSHh5eWHz5s347bffsG/fvgYYEREREZlC1HNOSkpKcObMGURHR+vKrKysEBwcjIyMjGrbFRYWwsPDA2VlZfD19cXSpUvRq1cvAEBWVhbUajWCg4N19e3s7ODn54eMjAyMHTu20vGKi4tRXFys29doNACAHAC2pg5SRLl/PF68K2oYJsnKL3+8crFM1DhMlZ1VHv/di/dEjsR497MKAADai1dFjsQ0ZVk55T/cvShuIKbKz/rjh4uAIGokJqgYg4T/SAEAGvB93UTOORE1Obl79y60Wq3ezAcAODs749KlS1W28fT0xMaNG+Hl5YWCggKsWLECAQEB+Omnn9ChQweo1WrdMf56zIrn/io2NhaLFy+uVL7SmEFZoPF7xY7AdDPGF9deSQL2jP9K7BBMphk/W+wQzGP3eLEjMJPGMI49YgcgHU3kUmLJXa3j7+8Pf39/3X5AQAB69OiBtWvXIiYmxqhjRkdHIyoqSrev0Wjg7u6O//EFetibGrF40tVA/M9AzERA5Vx7fUuU/jMQvx/4V4wD2quaix2O0c6lP8LO+Ad4JuY5KFUOYodjlN/Sb+CH+O+hWPQfWHVyFzsco5Ue/x5P1m0CAmMAe5XY4RgvJx04Ew8gBoBUx5EOIB5AEABpvi/K3QHwndhBNCqiJift2rWDXC5HXl6eXnleXh5cXFwMOkbz5s3Rt29fXL1aPtVc0S4vLw+urq56x/Tx8anyGAqFAgqFolL50A7A390MCsNixf8MhPYHfLuKHYnx4vcDg0Jboqdv5ddISnbGP4Aq9Ck4+0r3l+qH+O/RfNizkPf1EjsUkzxZtwnoGgq4+oodimnOxAMIBSDlccQD6AZAuu8L4DoaLDkpBSA3sb0EiHpCrLW1Nfr164fU1FRdWVlZGVJTU/VmR2qi1Wpx/vx5XSKiUqng4uKid0yNRoOTJ08afEwiIiKL1EQuJRZ9WScqKgoRERHo378/BgwYgLi4OBQVFWHy5MkAgIkTJ6J9+/aIjY0FACxZsgR/+9vf0LVrV+Tn5+O9997DjRs3MG3aNADlV/LMnj0bb7/9Nrp16waVSoX58+fDzc0N4eHhYg2TiIiIDCR6cjJmzBjcuXMHCxYsgFqtho+PDw4ePKg7oTU7OxtWVv+d4Ll//z6mT58OtVoNBwcH9OvXD8ePH0fPnj11debOnYuioiK8/PLLyM/Px8CBA3Hw4MFKN2sjIiKSFFPvVcITYg0XGRmJyMjIKp9LS0vT21+9ejVWr15d4/FkMhmWLFmCJUuWmCtEIiIi8TWRq3VEvwkbERER0Z9ZxMwJERERGaAUpk0rSORqHSYnREREUvEEgMzE9hLA5ISIiEgqmsgJsTznhIiIiCwKZ06IiIikguecEBERkUXhpcREREREDY8zJ0RERFJh6tU2vFqHiIiIzEoL09Y8uKxDREREVHecOSEiIpKKUph2EzaJXK3DmRMiIiKpKDXDVke3bt3C+PHj0bZtW9ja2qJPnz44ffp0jW3S0tLg6+sLhUKBrl27IikpqU59MjkhIiKiKt2/fx/PPPMMmjdvjq+//ho///wzVq5cCQcHh2rbZGVlISwsDEFBQcjMzMTs2bMxbdo0JCcnG9wvl3WIiIikwtRlmTq2X758Odzd3ZGYmKgrU6lUNbZJSEiASqXCypUrAQA9evTAsWPHsHr1aoSEhBjUL2dOiIiIpEJrhq0OvvzyS/Tv3x+jRo2Ck5MT+vbti08++aTGNhkZGQgODtYrCwkJQUZGhsH9MjkhIiKSCjOdc6LRaPS24uLiKrv79ddfER8fj27duiE5ORkzZszAa6+9hk2bNlUbolqthrOzs16Zs7MzNBoNHj16ZNAwmZwQERE1Me7u7rCzs9NtsbGxVdYrKyuDr68vli5dir59++Lll1/G9OnTkZCQUK/x8ZwTIiIiqTDTOSc5OTlQKpW6YoVCUWV1V1dX9OzZU6+sR48e2L17d7VduLi4IC8vT68sLy8PSqUStra2BoXJ5ISIiEgqSgEIJrT/45wTpVKpl5xU55lnnsHly5f1yn755Rd4eHhU28bf3x8HDhzQK0tJSYG/v7/BYXJZh4iIiKr0+uuv48SJE1i6dCmuXr2Kbdu2Yd26dZg5c6auTnR0NCZOnKjbf+WVV/Drr79i7ty5uHTpEj7++GPs2rULr7/+usH9MjkhIiKSiga+Wufpp5/G3r17sX37dvTu3RsxMTGIi4vDSy+9pKuTm5uL7Oxs3b5KpcL+/fuRkpICb29vrFy5EuvXrzf4MmKAyzpERETSYaZlnbp4/vnn8fzzz1f7fFV3fw0MDMS5c+fq3tkfOHNCREREFoUzJ0RERFIhwsyJGJicEBERSUUpgDIT2pvStgFxWYeIiIgsCmdOiIiIpEIL05Z1JDJzwuSEiIhIKkph2poHkxMiIiIyqyaSnPCcEyIiIrIonDkhIiKSiidoEjMnTE6IiIikogymnRBrStsGxGUdIiIisiicOSEiIpKKUgAyE9pz5sRwa9asQadOnWBjYwM/Pz+cOnWq2rqffPIJBg0aBAcHBzg4OCA4OLhS/UmTJkEmk+ltw4YNq+9hEBER1a9SM2wSIHpysnPnTkRFRWHhwoU4e/YsvL29ERISgtu3b1dZPy0tDePGjcO3336LjIwMuLu7Y+jQobh165ZevWHDhiE3N1e3bd++vSGGQ0RERCYSPTlZtWoVpk+fjsmTJ6Nnz55ISEhAixYtsHHjxirrf/rpp3j11Vfh4+OD7t27Y/369SgrK0NqaqpePYVCARcXF93m4ODQEMMhIiKqP0/MsEmAqMlJSUkJzpw5g+DgYF2ZlZUVgoODkZGRYdAxHj58iCdPnqBNmzZ65WlpaXBycoKnpydmzJiBe/fumTV2IiKiBqc1wyYBop4Qe/fuXWi1Wjg7O+uVOzs749KlSwYd4z//+Q/c3Nz0Epxhw4bh//7f/wuVSoVr167hzTffxPDhw5GRkQG5XF7pGMXFxSguLtbtazQaAMDlfKBVcyMGZiGyHpQ/XswRNw5TZOWVP/56sUTcQEx0K6v8vyu/X7wjciTG02TdBwBoL10RORLTlF3/4w1x96K4gZgqP+uPH6Q8joox3BU1CtPxP79mJ4jo1q1bAgDh+PHjeuVz5swRBgwYUGv72NhYwcHBQfjhhx9qrHft2jUBgHD48OEqn1+4cKGA8nOYuXHjxo0bN6O2goICwz8A66igoOCPfgoEQDBhK6j3WM1B1JmTdu3aQS6XIy8vT688Ly8PLi4uNbZdsWIFli1bhsOHD8PLy6vGup07d0a7du1w9epVPPfcc5Wej46ORlRUlG5fo9HA3d0d/xMG9HCtw4AsTPpVID4NiIkEVO3FjsY46eeA+F3AyzEucFNZix2O0X5ML8Ke+Hv4W8xQtFa1qb2BBVKnX8f5+BNoviAaVh4dxQ7HaNoTp1D6SSIwKAawV4kdjvFupgPn4gHEAJDqONIBxAMIAiDl8wLvAPhO7CAaFVGTE2tra/Tr1w+pqakIDw8HAN3JrZGRkdW2e/fdd/HOO+8gOTkZ/fv3r7Wfmzdv4t69e3B1rTrTUCgUUCgUlcqH9gL+/pRhY7FU8WlA6CDAt6fYkRgvfhcQEKqEp28LsUMxyZ74e/AI7Q4n3w5ih2K08/En0Gzoc5D39RY7FJOUfpIIdA0FXHzFDsU05+IBhAKQ8jjiAXQD4CZ2ICa4DiYn5iX61TpRUVH45JNPsGnTJly8eBEzZsxAUVERJk+eDACYOHEioqOjdfWXL1+O+fPnY+PGjejUqRPUajXUajUKCwsBAIWFhZgzZw5OnDiB69evIzU1FSNHjkTXrl0REhIiyhiJiIjIcKLfIXbMmDG4c+cOFixYALVaDR8fHxw8eFB3kmx2djasrP6bQ8XHx6OkpAT/+Mc/9I6zcOFCLFq0CHK5HD/++CM2bdqE/Px8uLm5YejQoYiJialydoSIiIgsi+jJCQBERkZWu4yTlpamt3/9+vUaj2Vra4vk5GQzRUZERGRJTL1ZiTRudCL6sg4RERHRn1nEzAkREREZwtQvyJHGl+swOSEiIpIMLusQERERNTjOnBAREUkGl3WIiIjIopTCtKUZaSQnXNYhIiIii8KZEyIiIsloGifEMjkhIiKSDJ5zQkRERBaF55wQERERNTjOnBAREUlG01jW4cwJERGRZDwxw2a4RYsWQSaT6W3du3evtn5SUlKl+jY2NnUdJGdOiIiIqHq9evXC4cOHdfvNmtWcOiiVSly+fFm3L5PJ6twnkxMiIiLJaPhlnWbNmsHFxcXg+jKZrE71q8JlHSIiIsmouFrH2K3uycmVK1fg5uaGzp0746WXXkJ2dnaN9QsLC+Hh4QF3d3eMHDkSP/30U537ZHJCRETUxGg0Gr2tuLi4ynp+fn5ISkrCwYMHER8fj6ysLAwaNAgPHjyosr6npyc2btyIL774Alu3bkVZWRkCAgJw8+bNOsXHZR0iIiLJMM+yjru7u17pwoULsWjRokq1hw8frvvZy8sLfn5+8PDwwK5duzB16tRK9f39/eHv76/bDwgIQI8ePbB27VrExMQYHCWTEyIiIskwz+3rc3JyoFQqdaUKhcKg1vb29njqqadw9epVg+o3b94cffv2Nbh+BS7rEBERNTFKpVJvMzQ5KSwsxLVr1+Dq6mpQfa1Wi/PnzxtcvwKTEyIiIskoNcNmuH//+984cuQIrl+/juPHj+OFF16AXC7HuHHjAAATJ05EdHS0rv6SJUtw6NAh/Prrrzh79izGjx+PGzduYNq0aXXql8s6REREktGw361z8+ZNjBs3Dvfu3YOjoyMGDhyIEydOwNHREQCQnZ0NK6v/znPcv38f06dPh1qthoODA/r164fjx4+jZ8+edeqXyQkREZFkNOx9Tnbs2FHj82lpaXr7q1evxurVq+saVCVc1iEiIiKLwpkTIiIiyTDP1TqWjskJERGRZDSN5ITLOkRERGRROHNCREQkGQ3/xX9iYHJCREQkGQ17KbFYuKxDREREFoUzJ0RERJLBZR0iIiKyKE9g2kc3r9YhIiIiqjPOnBAREUkGl3WIiIjIovBqnQazZs0adOrUCTY2NvDz88OpU6dqrP/ZZ5+he/fusLGxQZ8+fXDgwAG95wVBwIIFC+Dq6gpbW1sEBwfjypUr9TkEIiKiBlBqhs3yiZ6c7Ny5E1FRUVi4cCHOnj0Lb29vhISE4Pbt21XWP378OMaNG4epU6fi3LlzCA8PR3h4OC5cuKCr8+677+KDDz5AQkICTp48iZYtWyIkJASPHz9uqGERERGRkURPTlatWoXp06dj8uTJ6NmzJxISEtCiRQts3Lixyvrvv/8+hg0bhjlz5qBHjx6IiYmBr68vPvroIwDlsyZxcXF46623MHLkSHh5eWHz5s347bffsG/fvgYcGRERkbk9McNm+URNTkpKSnDmzBkEBwfryqysrBAcHIyMjIwq22RkZOjVB4CQkBBd/aysLKjVar06dnZ28PPzq/aYRERE0tA0lnVEPSH27t270Gq1cHZ21it3dnbGpUuXqmyjVqurrK9Wq3XPV5RVV+eviouLUVxcrNsvKCgAAGRm12EwFuhibvnjmZ+BwofixmKsi1nlj5fOPMSjQq24wZjg+sXyJcU7Z27hSWFxLbUt0/2L5Uut2swfIRQViRyN8bS//HH+We4ZoKRQ3GBMcffiHz+cASDVcVSMIRdAiZiBmKj8s0UQhAboy9S/H9L4+8OrdQDExsZi8eLFlcpn7RAhmHrwcuWhSc6yl2+KHYJZfPPybrFDMFlJZJTYIZjHwZfFjsBMGsM4/lfsAMzi3r17sLOzq5djW1tbw8XFBWr1apOP5eLiAmtrazNEVX9ETU7atWsHuVyOvLw8vfK8vDy4uLhU2cbFxaXG+hWPeXl5cHV11avj4+NT5TGjo6MRFfXfP7j5+fnw8PBAdnZ2vf2iNQSNRgN3d3fk5ORAqVSKHY5RGsMYgMYxjsYwBoDjsCSNYQxA+Wx7x44d0aZNm3rrw8bGBllZWSgpMX2GydraGjY2NmaIqv6ImpxYW1ujX79+SE1NRXh4OACgrKwMqampiIyMrLKNv78/UlNTMXv2bF1ZSkoK/P39AQAqlQouLi5ITU3VJSMajQYnT57EjBkzqjymQqGAQqGoVG5nZyfpN0wFpVIp+XE0hjEAjWMcjWEMAMdhSRrDGIDycybrk42NjcUnFeYi+rJOVFQUIiIi0L9/fwwYMABxcXEoKirC5MmTAQATJ05E+/btERsbCwCYNWsWBg8ejJUrVyIsLAw7duzA6dOnsW7dOgCATCbD7Nmz8fbbb6Nbt25QqVSYP38+3NzcdAkQERERWS7Rk5MxY8bgzp07WLBgAdRqNXx8fHDw4EHdCa3Z2dl62WhAQAC2bduGt956C2+++Sa6deuGffv2oXfv3ro6c+fORVFREV5++WXk5+dj4MCBOHjwYJPJOImIiKRM9OQEACIjI6tdxklLS6tUNmrUKIwaNara48lkMixZsgRLliwxKh6FQoGFCxdWudQjJY1hHI1hDEDjGEdjGAPAcViSxjAGoPGMw5LIhIa59omIiIjIIKLfIZaIiIjoz5icEBERkUVhckJEREQWhckJERERWZQmk5ysWbMGnTp1go2NDfz8/HDq1Kka63/22Wfo3r07bGxs0KdPHxw4cEDveUEQsGDBAri6usLW1hbBwcG4cuVKfQ6hTmP45JNPMGjQIDg4OMDBwQHBwcGV6k+aNAkymUxvGzZsWL2OAajbOJKSkirF+NdLwi39tQgMDKw0BplMhrCwMF0dMV6Lo0ePYsSIEXBzc4NMJjPoW7vT0tLg6+sLhUKBrl27IikpqVKdur7XTFHXMezZswdDhgyBo6MjlEol/P39kZycrFdn0aJFlV6L7t2719sYgLqPIy0trcrfqb9+f5glvxZV/c7LZDL06tVLV0eM1yI2NhZPP/00WrduDScnJ4SHh+Py5cu1trPEzwwpaxLJyc6dOxEVFYWFCxfi7Nmz8Pb2RkhICG7fvl1l/ePHj2PcuHGYOnUqzp07h/DwcISHh+PChQu6Ou+++y4++OADJCQk4OTJk2jZsiVCQkLw+PFjixhDWloaxo0bh2+//RYZGRlwd3fH0KFDcevWLb16w4YNQ25urm7bvn17vcRv7DiA8rtH/jnGGzdu6D1v6a/Fnj179OK/cOEC5HJ5pcvhG/q1KCoqgre3N9asWWNQ/aysLISFhSEoKAiZmZmYPXs2pk2bpvfhbszr25BjOHr0KIYMGYIDBw7gzJkzCAoKwogRI3Du3Dm9er169dJ7LY4dO1Yf4evUdRwVLl++rBenk5OT7jlLfy3ef/99vdhzcnLQpk2bSu+Lhn4tjhw5gpkzZ+LEiRNISUnBkydPMHToUBTV8GWXlviZIXlCEzBgwABh5syZun2tViu4ubkJsbGxVdYfPXq0EBYWplfm5+cn/POf/xQEQRDKysoEFxcX4b333tM9n5+fLygUCmH79u31MIK6j+GvSktLhdatWwubNm3SlUVERAgjR440d6g1qus4EhMTBTs7u2qPJ8XXYvXq1ULr1q2FwsJCXZkYr8WfARD27t1bY525c+cKvXr10isbM2aMEBISots39d/GFIaMoSo9e/YUFi9erNtfuHCh4O3tbb7A6siQcXz77bcCAOH+/fvV1pHaa7F3715BJpMJ169f15WJ/VoIgiDcvn1bACAcOXKk2jqW+JkhdY1+5qSkpARnzpxBcHCwrszKygrBwcHIyMiosk1GRoZefQAICQnR1c/KyoJardarY2dnBz8/v2qP2dBj+KuHDx/iyZMnlb6YKi0tDU5OTvD09MSMGTNw7949s8b+Z8aOo7CwEB4eHnB3d8fIkSPx008/6Z6T4muxYcMGjB07Fi1bttQrb8jXwhi1vS/M8W/T0MrKyvDgwYNK74srV67Azc0NnTt3xksvvYTs7GyRIqyZj48PXF1dMWTIEKSnp+vKpfhabNiwAcHBwfDw8NArF/u1KCgoAIAav9TP0j4zGoNGn5zcvXsXWq1Wdzv8Cs7OzpXWZyuo1eoa61c81uWYpjBmDH/1n//8B25ubnpvjmHDhmHz5s1ITU3F8uXLceTIEQwfPhxardas8VcwZhyenp7YuHEjvvjiC2zduhVlZWUICAjAzZs3AUjvtTh16hQuXLiAadOm6ZU39GthjOreFxqNBo8ePTLL72lDW7FiBQoLCzF69GhdmZ+fH5KSknDw4EHEx8cjKysLgwYNwoMHD0SMVJ+rqysSEhKwe/du7N69G+7u7ggMDMTZs2cBmOdvRkP67bff8PXXX1d6X4j9WpSVlWH27Nl45pln9L4i5a8s7TOjMbCI29dT/Vq2bBl27NiBtLQ0vZNJx44dq/u5T58+8PLyQpcuXZCWlobnnntOjFAr8ff3133jNFD+3Uo9evTA2rVrERMTI2JkxtmwYQP69OmDAQMG6JVL4bVobLZt24bFixfjiy++0DtXY/jw4bqfvby84OfnBw8PD+zatQtTp04VI9RKPD094enpqdsPCAjAtWvXsHr1amzZskXEyIyzadMm2NvbV/pyVrFfi5kzZ+LChQv1fp4LVdboZ07atWsHuVyOvLw8vfK8vDy4uLhU2cbFxaXG+hWPdTmmKYwZQ4UVK1Zg2bJlOHToELy8vGqs27lzZ7Rr1w5Xr141OeaqmDKOCs2bN0ffvn11MUrptSgqKsKOHTsM+qNa36+FMap7XyiVStja2prl9W0oO3bswLRp07Br165K0/F/ZW9vj6eeesqiXouqDBgwQBejlF4LQRCwceNGTJgwAdbW1jXWbcjXIjIyEl999RW+/fZbdOjQoca6lvaZ0Rg0+uTE2toa/fr1Q2pqqq6srKwMqampev8j/zN/f3+9+gCQkpKiq69SqeDi4qJXR6PR4OTJk9Ues6HHAJSfHR4TE4ODBw+if//+tfZz8+ZN3Lt3D66urmaJ+6+MHcefabVanD9/XhejVF4LoPxSw+LiYowfP77Wfur7tTBGbe8Lc7y+DWH79u2YPHkytm/frnc5d3UKCwtx7do1i3otqpKZmamLUSqvBVB+dczVq1cNStob4rUQBAGRkZHYu3cvvvnmG6hUqlrbWNpnRqMg9hm5DWHHjh2CQqEQkpKShJ9//ll4+eWXBXt7e0GtVguCIAgTJkwQ5s2bp6ufnp4uNGvWTFixYoVw8eJFYeHChULz5s2F8+fP6+osW7ZMsLe3F7744gvhxx9/FEaOHCmoVCrh0aNHFjGGZcuWCdbW1sLnn38u5Obm6rYHDx4IgiAIDx48EP79738LGRkZQlZWlnD48GHB19dX6Natm/D48eN6GYMx41i8eLGQnJwsXLt2TThz5owwduxYwcbGRvjpp5/0xmrJr0WFgQMHCmPGjKlULtZr8eDBA+HcuXPCuXPnBADCqlWrhHPnzgk3btwQBEEQ5s2bJ0yYMEFX/9dffxVatGghzJkzR7h48aKwZs0aQS6XCwcPHtTVqe3fRuwxfPrpp0KzZs2ENWvW6L0v8vPzdXXeeOMNIS0tTcjKyhLS09OF4OBgoV27dsLt27frZQzGjGP16tXCvn37hCtXrgjnz58XZs2aJVhZWQmHDx/W1bH016LC+PHjBT8/vyqPKcZrMWPGDMHOzk5IS0vT+x15+PChro4UPjOkrkkkJ4IgCB9++KHQsWNHwdraWhgwYIBw4sQJ3XODBw8WIiIi9Orv2rVLeOqppwRra2uhV69ewv79+/WeLysrE+bPny84OzsLCoVCeO6554TLly9bzBg8PDwEAJW2hQsXCoIgCA8fPhSGDh0qODo6Cs2bNxc8PDyE6dOn19sfLmPHMXv2bF1dZ2dnITQ0VDh79qze8Sz9tRAEQbh06ZIAQDh06FClY4n1WlRcjvrXrSL2iIgIYfDgwZXa+Pj4CNbW1kLnzp2FxMTESset6d9G7DEMHjy4xvqCUH55tKurq2BtbS20b99eGDNmjHD16tV6G4Mx41i+fLnQpUsXwcbGRmjTpo0QGBgofPPNN5WOa8mvhSCUX05ra2srrFu3rspjivFaVDUGAHq/61L5zJAymSAIQr1NyxARERHVUaM/54SIiIikhckJERERWRQmJ0RERGRRmJwQERGRRWFyQkRERBaFyQkRERFZFCYnREREZFGYnBAREZFFYXJCREREFoXJCREREVkUJidEVKM7d+7AxcUFS5cu1ZUdP34c1tbWlb6JlYjIHPjdOkRUqwMHDiA8PBzHjx+Hp6cnfHx8MHLkSKxatUrs0IioEWJyQkQGmTlzJg4fPoz+/fvj/Pnz+P7776FQKMQOi4gaISYnRGSQR48eoXfv3sjJycGZM2fQp08fsUMiokaK55wQkUGuXbuG3377DWVlZbh+/brY4RBRI8aZEyKqVUlJCQYMGAAfHx94enoiLi4O58+fh5OTk9ihEVEjxOSEiGo1Z84cfP755/jhhx/QqlUrDB48GHZ2dvjqq6/EDo2IGiEu6xBRjdLS0hAXF4ctW7ZAqVTCysoKW7ZswXfffYf4+HixwyOiRogzJ0RERGRROHNCREREFoXJCREREVkUJidERERkUZicEBERkUVhckJEREQWhckJERERWRQmJ0RERGRRmJwQERGRRWFyQkRERBaFyQkRERFZFCYnREREZFGYnBAREZFF+f+ByGZIPA3gMQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import porepy as pp\n",
    "from porepy.models.fluid_mass_balance import SinglePhaseFlow\n",
    "\n",
    "\n",
    "class SinglePhaseFlowExample2(ModifiedGeometry, SinglePhaseFlow):\n",
    "    # Note that now this is bc_type_darcy_flux, not the bc_type_fluid_flux.\n",
    "    def bc_type_darcy_flux(self, sd: pp.Grid) -> pp.BoundaryCondition:\n",
    "        \"\"\"Everything is the same as in the previous example.\"\"\"\n",
    "        domain_sides = self.domain_boundary_sides(sd)\n",
    "        return pp.BoundaryCondition(sd, faces=domain_sides.east, cond=\"dir\")\n",
    "\n",
    "    # Note that now this is bc_values_darcy_flux, not the bc_values_fluid_flux.\n",
    "    def bc_values_darcy_flux(self, boundary_grid: pp.BoundaryGrid) -> np.ndarray:\n",
    "        \"\"\"Setting the Darcy flux values on the west boundary.\"\"\"\n",
    "        darcy_flux_vals = np.zeros(boundary_grid.num_cells)\n",
    "\n",
    "        # Same as in the previous example\n",
    "        domain_sides = self.domain_boundary_sides(boundary_grid)\n",
    "        influx_cells = np.zeros(boundary_grid.num_cells, dtype=bool)\n",
    "        influx_cells[domain_sides.west] = True\n",
    "        influx_cells &= boundary_grid.cell_centers[1] > 0.5\n",
    "        influx_cells &= boundary_grid.cell_centers[1] < 1.5\n",
    "\n",
    "        # The value is the same\n",
    "        darcy_flux_vals[influx_cells] = self.fluid.convert_units(-1, \"Pa*m^-1\")\n",
    "        return darcy_flux_vals\n",
    "\n",
    "    # This method did not change.\n",
    "    def bc_values_pressure(self, boundary_grid: pp.BoundaryGrid) -> np.ndarray:\n",
    "        \"\"\"Everything is the same as in the previous example.\"\"\"\n",
    "        pressure_vals = np.zeros(boundary_grid.num_cells)\n",
    "        domain_sides = self.domain_boundary_sides(boundary_grid)\n",
    "        pressure_vals[domain_sides.east] = self.fluid.convert_units(5, \"Pa\")\n",
    "        return pressure_vals\n",
    "\n",
    "# We modify the fluid viscosity.\n",
    "fluid_constants = pp.FluidConstants(\n",
    "    {\n",
    "        \"viscosity\": 10,  # 10 times larger than in the previous example.\n",
    "    }\n",
    ")\n",
    "model_params = {\n",
    "    \"material_constants\": {\"fluid\": fluid_constants}\n",
    "}\n",
    "single_phase_flow = SinglePhaseFlowExample2(\n",
    "    params=model_params\n",
    ")\n",
    "pp.run_time_dependent_model(single_phase_flow)\n",
    "pp.plot_grid(single_phase_flow.mdg, single_phase_flow.pressure_variable, plot_2d=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The flux did not change, which is the expected behavior. The Darcy flux BC automatically applies the correct values of the convected quantity (it includes $\\mu$) to the boundary. However, if we used the `fluid_flux_bc_values` and changed $\\mu$, the flux would also change, as it knows nothing about the convected quantity! It could potentially lead to an error if we computed the flux manually based on the old value of $\\mu$, and then forgot to recompute it.\n",
    "\n",
    "Excercise: Apply the different $\\mu$ to the first example and see how the fluid flux changes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Momentum balance\n",
    "Similar to the previous problems, we need to define one method for the type of boundary condition we are interested in, and another one for assigning the values. \n",
    "The momentum balance model class has the following methods predefined for setting boundary condition types and values:\n",
    "* `bc_type_mechanics` for setting boundary condition type.\n",
    "* `bc_values_displacement` for Dirichlet values.\n",
    "* `bc_values_stress` for Neumann values.\n",
    "\n",
    "As opposed to with the previous examples, this is a vector problem. \n",
    "Therefore we have to assign vectorial boundary condition values. \n",
    "In addition to this we will demonstrate how to set time-dependent boundary condition values. \n",
    "This is shown below:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import porepy as pp\n",
    "\n",
    "from porepy.models.momentum_balance import MomentumBalance\n",
    "\n",
    "\n",
    "class ModifiedBoundaryConditions:\n",
    "    def bc_type_mechanics(self, sd: pp.Grid) -> pp.BoundaryConditionVectorial:\n",
    "        \"\"\"Set boundary condition type for the problem.\"\"\"\n",
    "        bounds = self.domain_boundary_sides(sd)\n",
    "\n",
    "        # Set the type of west and east boundaries to Dirichlet. North and south are\n",
    "        # Neumann by default.\n",
    "        bc = pp.BoundaryConditionVectorial(sd, bounds.west + bounds.east, \"dir\")\n",
    "        return bc\n",
    "\n",
    "    def bc_values_stress(self, bg: pp.BoundaryGrid) -> np.ndarray:\n",
    "        \"\"\"Setting stress boundary condition values at north and south boundaries.\n",
    "\n",
    "        Specifically, we assign different values for the x- and y-component of the\n",
    "        boundary value vector.\n",
    "\n",
    "        \"\"\"\n",
    "        values = np.ones((self.nd, bg.num_cells))\n",
    "        bounds = self.domain_boundary_sides(bg)\n",
    "\n",
    "        # Assigning x-component values\n",
    "        values[0][bounds.north + bounds.south] *= self.solid.convert_units(4.5, \"Pa\")\n",
    "\n",
    "        # Assigning y-component values\n",
    "        values[1][bounds.north + bounds.south] *= self.solid.convert_units(0.5, \"Pa\")\n",
    "\n",
    "        return values.ravel(\"F\")\n",
    "\n",
    "    def bc_values_displacement(self, bg: pp.BoundaryGrid) -> np.ndarray:\n",
    "        \"\"\"Setting displacement boundary condition values.\n",
    "\n",
    "        This method returns an array of boundary condition values with the value 5t for\n",
    "        western boundaries and ones for the eastern boundary.\n",
    "\n",
    "        \"\"\"\n",
    "        # Fetch the time of the current time-step\n",
    "        t = self.time_manager.time\n",
    "\n",
    "        values = np.zeros((self.nd, bg.num_cells))\n",
    "        bounds = self.domain_boundary_sides(bg)\n",
    "\n",
    "        # Assign a time dependent value to the x-component of the western boundary\n",
    "        values[0][bounds.west] += self.solid.convert_units(5.0 * t, \"m\")\n",
    "        values[0][bounds.east] += self.solid.convert_units(1.0, \"m\")\n",
    "\n",
    "        # The convention for flattening nd-arrays of vector values in PorePy is by using\n",
    "        # the Fortran-style ordering (chosen by string \"F\" when giving a call to ravel).\n",
    "        # That is, the first index changes the fastest and the last index changes\n",
    "        # slowest.\n",
    "        return values.ravel(\"F\")\n",
    "\n",
    "\n",
    "class MomentumBalanceTimeDependentBC(\n",
    "    ModifiedGeometry, ModifiedBoundaryConditions, MomentumBalance\n",
    "):\n",
    "    ...\n",
    "\n",
    "\n",
    "# Set final time, amount of time-steps and the time-step size\n",
    "final_time = 10.0\n",
    "time_steps = 10.0\n",
    "dt = final_time / time_steps\n",
    "\n",
    "# Instantiate pp.TimeManager with the information provided above\n",
    "time_manager = pp.TimeManager(\n",
    "    schedule=[0.0, final_time],\n",
    "    dt_init=dt,\n",
    "    constant_dt=True,\n",
    ")\n",
    "\n",
    "# Include the time_manager to the model params dictionary\n",
    "model_params = {\n",
    "    \"time_manager\": time_manager\n",
    "}\n",
    "model = MomentumBalanceTimeDependentBC(model_params)\n",
    "pp.run_time_dependent_model(model=model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visualization of the solution to this problem is demonstrated in the GIF below. \n",
    "We have used ParaView for the visualization and exaggerated the displacements for visualization purposes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src='img/time_dependent_bc.gif'  width=600>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# What we have explored\n",
    "We have seen how to set boundary conditions for both scalar and vector problems.\n",
    "The examples presented in this tutorial are the physical problems of single phase flow and the momentum balance equation."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "porepy",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
